【问题标题】:iOS share extension not getting the imageiOS共享扩展未获取图像
【发布时间】:2015-09-11 14:06:38
【问题描述】:

我相信一旦有人向我指出正确的方向,这就是微不足道的,所以我为提出一个愚蠢的问题而道歉。但是我一直在寻找我无法弄清楚我做错了什么。

场景:创建一个接收图像文件的简单共享扩展

问题:当我访问附件时,处理程序永远不会被调用,尽管我可以在 itemProvider 中看到“public.jpg”但我看不到数据在哪里?

我做了什么:

1) defined NSExtensionActivationSupportsImageWithMaxCount = 1 as my only activation rule
2) added CoreMedia framework to the extension
3) added the same group to both app and app extension
4) made sure both have the group (1) in the entitlement
5) made sure both are using a certificate/app id with that group enabled
6) clean and rebuild several times to no avail.

代码:

- (void)didSelectPost {
/
for (NSExtensionItem *item in self.extensionContext.inputItems) {
    for (NSItemProvider *itemProvider in item.attachments) {
        if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeImage]) {
I can hit this breakpoint --> [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeImage options:nil completionHandler:^(UIImage *image, NSError *error) {
but not this one --> photo = image;
            }];
            break;
        }
    }
}
.... and so on and so forth

【问题讨论】:

  • 因为您已经指出以下答案是正确的,您应该将其标记为正确。我相信你甚至可以得到一些 SO 积分。

标签: ios objective-c ios8-share-extension


【解决方案1】:

您尚未发布完整代码,但我怀疑您在错误的位置调用 completeRequestReturningItems:completionHandler:

错误

- (void)didSelectPost {
        NSExtensionItem *item = self.extensionContext.inputItems.firstObject;
        NSItemProvider *itemProvider = item.attachments.firstObject;
        if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeImage]) {
            [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeImage
                                            options:nil
                                  completionHandler:^(NSURL *url, NSError *error) {
                                      // send the image
                                  }];
        }
        // ↓ this is the wrong location ↓
        [self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];
    }

问题是调用completeRequestReturningItems:completionHandler: 会立即关闭 ShareViewController 并释放它。所以包含图像的 NSItemProvider 在它可以访问图像之前也会被销毁(因为它异步加载它的项目)。换句话说:将图像发送到服务器的完成处理程序永远不会被调用,因为整个 shareViewController 已经被释放。

要解决该问题,您必须在发送图像后将对 completeRequestReturningItems:completionHandler: 的调用移至完成处理程序的末尾。

正确:

- (void)didSelectPost {
    NSExtensionItem *item = self.extensionContext.inputItems.firstObject;
    NSItemProvider *itemProvider = item.attachments.firstObject;
    if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeImage]) {
        [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeImage
                                        options:nil
                              completionHandler:^(NSURL *url, NSError *error) {
                                  // send the image
                                  [self.extensionContext completeRequestReturningItems:@[]         
                                                                     completionHandler:nil];
                              }];
    }
}

【讨论】:

  • 你是绝对正确的。我从 Apple 开发者论坛中得到了类似的提示。谢谢!对于其他阅读本文的人,只需按照 Rene 的说明进行操作,并确保在获得数据之前不发送完整的请求消息。
  • 很高兴它对您有所帮助。请将答案标记为已接受,以便其他人可以看到它解决了您的问题。
  • 谢谢乔恩。虽然这对我的问题没有帮助,但我感谢您向提问者提供的详细信息。
  • 谢谢!这有很大帮助!我不应该在 didSelectPost 结束时调用 completeRequestReturningItems,只能在完成处理程序内部调用。
  • 问题是 [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeImage 无法返回图像,尽管 completeRequestReturningItems 放置了正确的位置。
猜你喜欢
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多