iOS共享扩展没有得到图像

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

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

问题:当我访问附件时,尽pipe我可以看到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 

你还没有发布完整的代码,但我怀疑你正在调用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:立即closuresShareViewController并释放它。 因此,包含图像的NSItemProvider在它可以访问图像之前也被销毁(因为它asynchronous加载它的项目)。 换句话说:将图像发送到服务器的完成处理程序永远不会被调用,因为整个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]; }]; } }