iOS分享扩展无法获取图片。

4

我相信一旦有人指点我正确的方向,这就是微不足道的问题,所以我很抱歉问了一个愚蠢的问题。然而,我已经搜索了几天,但我无法弄清楚我做错了什么。

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

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

我已经做了什么:

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 积分。 - eric
1个回答

6
你还没有发布完整的代码,但我怀疑你在错误的位置调用了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];
                              }];
    }
}

你说得完全正确。我从苹果开发者论坛上也得到了类似的提示。谢谢!对于其他人阅读此内容,只需按照Rene的指示操作,并确保在获取数据之前不要发送完整的请求消息。 - Andrea Mariotti
很高兴能帮到你。请标记答案为已接受,这样其他人就可以看到它解决了你的问题。 - joern
谢谢Joern。虽然这并没有解决我的问题,但我很感激你为提问者提供的详细信息。 - eric
谢谢!这帮了很多忙!我不应该在didSelectPost的末尾调用completeRequestReturningItems,而只能在完成处理程序内部调用它。 - EternalLight
问题是[itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeImage]无法返回图像,尽管completeRequestReturningItems已经放置了正确的位置。 - evan
还有一件事:我已经测试了我的代码。如果您已经正确设置了completeRequestReturningItems位置,图像将会返回。因此,completeRequestReturningItems必须像@joern所说的那样正确。 - evan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接