我为我的应用创建了一个共享扩展程序,用户可以通过该扩展程序来创建带有图像的帖子。当选择并共享“照片”中的任何图像时,它的效果非常好。但是当拍摄并直接共享屏幕截图时,共享扩展名无法获取它。
我已经编写了用于获取图像的代码。
-(void)fetchImages {
for (NSExtensionItem *item in self.extensionContext.inputItems) {
[item.attachments enumerateObjectsUsingBlock:^(NSItemProvider * _Nonnull itemProvider, NSUInteger idx, BOOL * _Nonnull stop) {
if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeImage]) {
[itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeImage options:nil completionHandler:^(NSData *image, NSError *error) {
// You will get Image data here that you can submit to server.
[self showAlertWithMessage:[error localizedDescription]];
if(image) {
[self saveImage:image atIndex:idx];
}
}];
}
}];
}
}
在viewDidLoad之后调用上述方法。从“照片”中选择任何图像时,其显示效果都很好,但是在拍摄后立即共享屏幕截图时,出现错误“无法强迫某项归类为nsdata” 。我对此表示感谢。谢谢。
答案 0 :(得分:1)
尽管很早以前就问过这个问题,但我也面临着同样的问题。在共享扩展名中,我可以在选择照片/文件时获取图像/文件/音频/视频,但是当我尝试在捕获后立即共享屏幕截图时,我无法将屏幕截图数据提取为NSData,但格式不正确,并且无法证明这一点。经过数小时的努力,我找到了解决方案,您需要检查两件事:
问题说明: 1-截取屏幕快照时,它不是kUTTypeImage类型,而是public.image类型。因此,在获取类型的数据时,请记住这一点。 2-其次,您不能将其作为NSData来获取,而需要在完成处理程序中作为“ id项”来获取。
示例:
// To extract selected files
NSExtensionItem *selectedContent = self.extensionContext.inputItems[0];
// For single selected files, selected content will be at 0 index
NSItemProvider *itemProvider = extensionItem.attachments[0]; // No need to worry about multiple selected files, you can iterate extensionItem.attachments to extract all selected files one by one.
// Now extract all registered **itemTypeIdentifiers** instead of fetching data by providing type by yourself
NSArray *registeredTypeIdentifiers = itemProvider.registeredTypeIdentifiers;
// You can validate before fetching that actually the selected item is of corresponding type
if ([itemProvider hasItemConformingToTypeIdentifier:registeredTypeIdentifiers.firstObject]) {
// Now fetch data by passing corresponding data type
[itemProvider loadItemForTypeIdentifier:registeredTypeIdentifiers.firstObject options:nil completionHandler:^(id<NSSecureCoding> item, NSError *error) {
if (item) {
// For all selected photos/files
if([(NSObject*)item isKindOfClass:[NSURL class]]) {
NSData *contentData = [NSData dataWithContentsOfURL:(NSURL *)item];
// continue working with selected image/file
}
if([(NSObject*)item isKindOfClass:[UIImage class]]) {
NSData *contentData = UIImagePNGRepresentation((UIImage*)item);
// continue working with screenshot data
}
}
}];
}
欢呼!
答案 1 :(得分:0)
ModuleNotFoundError: No module named 'test.a'
项目可能有多种类型。