如何将图像格式的URL通过共享扩展传递到应用程序

问题描述:

我正在使用共享扩展来共享图库阵列。我可以用如何将图像格式的URL通过共享扩展传递到应用程序

- (void)getImageFromExtension:(NSExtensionItem *)extensionItem 
{ 
    for(NSItemProvider *attachment in extensionItem.attachments) 
    { 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      if([attachment hasItemConformingToTypeIdentifier:(NSString *)kUTTypeImage]) 
      { 
       [attachment loadItemForTypeIdentifier:(NSString *)kUTTypeImage options:nil completionHandler:^(id<NSSecureCoding> item, NSError *error) { 
        NSURL *image = (NSURL *)item; 
        if(error) 
        { 
         NSLog(@"Error retrieving image"); 
        } else { 
         dispatch_async(dispatch_get_main_queue(), ^{ 
          NSLog(@"*** ### %@",[UIImage imageWithData:[NSData dataWithContentsOfURL:image]]); 
         }); 
        } 
       }]; 
      } 
     }); 
    } 
} 

我真正需要的是,我需要图像URL传递到容器applciation获得份额扩展中的形象。但无法从该网址获取图片。网址格式为file:///var/mobile/Media/DCIM/101APPLE/IMG_1705.JPG

来自此网址的数据始终为空。如何从这个网址获取图片?

您可能会打电话给getImageFromExtensiondidSelectPost。在didSelectPost结尾处,您应该调用completeRequestReturningItems:completionHandler:来告诉主机应用程序使用一系列结果项来完成应用程序扩展请求。当调用该方法时,整个ShareViewController被解除并释放。当您在didSelectPost的末尾调用此函数时,它会在NSItemProvider检索图像URL之前执行。因为这是异步发生的。为了解决这个问题,您必须在NSItemProvider检索到imageURL后调用completeRequestReturningItems:completionHandler:

下面是它如何工作:

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

顺便说一句,有没有必要与NSItemProvider工作作为供应商已经在做他的工作异步时使用dispatch_async

我已经写了一个blog post这个,如果你想更多地阅读这个。

编辑

现在,您可以加载您刚刚恢复的文件路径的图像。这只适用于扩展!如果您想从包含应用程序访问图片,则无法使用刚才检索的文件网址。共享扩展将选定的图像保存在包含应用程序无法访问的文件夹中。

要使图像可用于包含应用程序,您必须在您的应用程序和扩展程序中激活App Groups。然后扩展的图像保存到所述共享容器和含有应用程序可以检索它:

func saveImage(url: NSURL) { 
    guard let imageData = NSData(contentsOfURL: url) else { return } 
    let selectedImage = UIImage(data: imageData) 

    let fileManager = NSFileManager.defaultManager() 
    if let sharedContainer = fileManager.containerURLForSecurityApplicationGroupIdentifier("YOUR_GROUP_IDENTIFIER") { 
     if let dirPath = sharedContainer.path { 
      let sharedImageFilePath = dirPath + "/image.png" 
      let binaryImageData = UIImagePNGRepresentation(selectedImage!) 
      binaryImageData?.writeToFile(sharedImageFilePath, atomically: true) 
      // send the sharedImageFilePath to the containing app 
     } 
    } 
} 
+0

感谢@joren,具有一个问题,为什么的URL(在共享扩展生成)'文件IM:/// VAR /移动/媒体/ DCIM/101APPLE/IMG_1705.JPG'主机应用程序无法评估? –

+0

你有错误信息吗?它说什么? – joern

+0

我只是试图从URL获取NSData。数据重新调整为空 –