从照片库共享图像时出现iOS共享扩展问题
下面是我用来在“ShareViewController.m”中共享图像的代码 如果我分享一张WhatsApp的图片,一切都很好但如果我想共享照片库或Facebook Messenger中的图像,则该功能无效 有人知道问题出在哪里吗从照片库共享图像时出现iOS共享扩展问题,ios,objective-c,xcode,share,share-extension,Ios,Objective C,Xcode,Share,Share Extension,下面是我用来在“ShareViewController.m”中共享图像的代码 如果我分享一张WhatsApp的图片,一切都很好但如果我想共享照片库或Facebook Messenger中的图像,则该功能无效 有人知道问题出在哪里吗 谢谢以下是我解决问题的方法。我去掉了(NSString*)kUTTypeURL],添加了itemProvider.registeredTypeIdentifiers,以获取包含所有可用类型标识符的数组。然后,我只使用第一个可用的作为registeredTypeIden
谢谢以下是我解决问题的方法。我去掉了
(NSString*)kUTTypeURL]
,添加了itemProvider.registeredTypeIdentifiers
,以获取包含所有可用类型标识符的数组。然后,我只使用第一个可用的作为registeredTypeIdentifiers.firstObject
另外,非常重要,NSData*data
已更改为id项
,这使得从中获取NSData
有点不同。这一点非常重要,尤其是在从Messenger共享图像时-它们的类型标识符是“public.image”,而不是像照片库或WhatsApp中那样的“public.jpeg”或“public.url”
NSExtensionItem *item = [self.extensionContext.inputItems objectAtIndex:i];
NSItemProvider *itemProvider = item.attachments.firstObject;
// get type of file extention (jpeg, file, url, png ...)
NSArray *registeredTypeIdentifiers = itemProvider.registeredTypeIdentifiers;
if ([itemProvider hasItemConformingToTypeIdentifier:registeredTypeIdentifiers.firstObject) {
[itemProvider loadItemForTypeIdentifier:registeredTypeIdentifiers.firstObject options:nil completionHandler:^(id<NSSecureCoding> item, NSError *error) {
NSData *imgData;
if([(NSObject*)item isKindOfClass:[NSURL class]]) {
imgData = [NSData dataWithContentsOfURL:(NSURL*)item];
}
if([(NSObject*)item isKindOfClass:[UIImage class]]) {
imgData = UIImagePNGRepresentation((UIImage*)item);
}
// the rest of uploading script goes here
}];
}
NSExtensionItem*item=[self.extensionContext.inputItems objectAtIndex:i];
NSItemProvider*itemProvider=item.attachments.firstObject;
//获取文件扩展名的类型(jpeg、文件、url、png…)
NSArray*registeredTypeIdentifiers=itemProvider.registeredTypeIdentifiers;
if([itemProvider hasItemConformingToTypeIdentifier:registeredTypeIdentifiers.firstObject){
[itemProvider loadItemForTypeIdentifier:registeredTypeIdentifiers.firstObject选项:nil completionHandler:^(id项,NSError*错误){
NSData*imgData;
如果([(NSObject*)项是kindof类:[NSURL类]]){
imgData=[NSData DATA with contents sofURL:(NSURL*)项];
}
如果([(NSObject*)项是kindof类:[UIImage类]]){
imgData=UIImagePngResentation((UIImage*)项);
}
//上传脚本的其余部分在这里
}];
}
我就是这样解决的。我去掉了(NSString*)kUTTypeURL]
并添加了itemProvider。registeredTypeIdentifiers
以获取包含所有可用类型标识符的数组。然后,我只使用第一个可用的作为registeredTypeIdentifiers.firstObject
另外,非常重要,NSData*data
已更改为id项
,这使得从中获取NSData
有点不同。这一点非常重要,尤其是在从Messenger共享图像时-它们的类型标识符是“public.image”,而不是像照片库或WhatsApp中那样的“public.jpeg”或“public.url”
NSExtensionItem *item = [self.extensionContext.inputItems objectAtIndex:i];
NSItemProvider *itemProvider = item.attachments.firstObject;
// get type of file extention (jpeg, file, url, png ...)
NSArray *registeredTypeIdentifiers = itemProvider.registeredTypeIdentifiers;
if ([itemProvider hasItemConformingToTypeIdentifier:registeredTypeIdentifiers.firstObject) {
[itemProvider loadItemForTypeIdentifier:registeredTypeIdentifiers.firstObject options:nil completionHandler:^(id<NSSecureCoding> item, NSError *error) {
NSData *imgData;
if([(NSObject*)item isKindOfClass:[NSURL class]]) {
imgData = [NSData dataWithContentsOfURL:(NSURL*)item];
}
if([(NSObject*)item isKindOfClass:[UIImage class]]) {
imgData = UIImagePNGRepresentation((UIImage*)item);
}
// the rest of uploading script goes here
}];
}
NSExtensionItem*item=[self.extensionContext.inputItems objectAtIndex:i];
NSItemProvider*itemProvider=item.attachments.firstObject;
//获取文件扩展名的类型(jpeg、文件、url、png…)
NSArray*registeredTypeIdentifiers=itemProvider.registeredTypeIdentifiers;
if([itemProvider hasItemConformingToTypeIdentifier:registeredTypeIdentifiers.firstObject){
[itemProvider loadItemForTypeIdentifier:registeredTypeIdentifiers.firstObject选项:nil completionHandler:^(id项,NSError*错误){
NSData*imgData;
如果([(NSObject*)项是kindof类:[NSURL类]]){
imgData=[NSData DATA with contents sofURL:(NSURL*)项];
}
如果([(NSObject*)项是kindof类:[UIImage类]]){
imgData=UIImagePngResentation((UIImage*)项);
}
//上传脚本的其余部分在这里
}];
}
此答案非常有用。截图刚被捕获,我就试图分享截图,但当我试图使用kUTTypeImage访问截图时,截图返回了数据,但已损坏。然后,此答案帮助我确定了问题区域,即我应该使用id项,而不是使用NSURL或NSData。添加了问题的简短说明以提供帮助其他。谢谢@Ekashking此答案非常有用。我试图在截图被捕获后共享截图,但当我试图使用kUTTypeImage访问截图时,截图返回了数据,但已损坏。然后此答案帮助我确定了问题区域,即我应该使用id项而不是使用NSURL或NSData。添加了对m的简短描述我很乐意帮助别人。谢谢@ekashking