ios - 如何在 iOS Share Extension 中获取屏幕截图?

标签 ios objective-c

我为我的应用程序创建了一个共享扩展,用户可以通过它创建带有图像的帖子。 It works perfectly well when any image from "Photos"is selected and shared but when a screenshot is taken and directly shared, the share extension is not able to fetch it.

我已经编写了用于获取图像的代码。

-(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 类” .对此有任何帮助,我将不胜感激。谢谢。

最佳答案

虽然很久以前就有人问过这个问题,但我面临着同样的问题。在共享扩展中,我能够在选择照片/文件时获取图像/文件/音频/视频,但是当我在捕获后立即尝试共享屏幕截图时,我无法将屏幕截图数据检索为 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
                  }
                        
              }
          }];
                
}
干杯!

关于ios - 如何在 iOS Share Extension 中获取屏幕截图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53896372/

相关文章:

ios - 当我的游戏在 sprite kit 中暂停时如何返回主场景

ios - watch 上未收到 WatchKit Darwin 通知

ios - 如何使 UIScrollView 高度等于内容高度?

ios - iOS9 中具有自适应布局的 Center 4 图像

ios - 奇怪类型的 NSZombie

ios - 在 iOS 中检索短信文本

iphone - 如何判断plist中是否包含NSDictionary或NSMutableArray?

iphone - 没有符号的 NSNumberFormatter 货币?

objective-c - CoreData 无法完成错误

ios - 为什么Xcode 9.4.1不允许我使用UIImage pngData()实例方法?