Mur*_*m K 5 cocoa-touch ios ios8-share-extension ios-sharesheet
我正致力于使用共享扩展来共享库中的图像数组.我可以使用共享扩展内的图像
- (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]]);
});
}
}];
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
我真正需要的是,我需要将图像URL传递给容器应用程序.但无法从该URL获取图像.网址格式是file:///var/mobile/Media/DCIM/101APPLE/IMG_1705.JPG
此URL中的数据始终为null.如何从这个URL获取图像?
您可能getImageFromExtension从拨打电话didSelectPost。最后,didSelectPost您应该调用告诉completeRequestReturningItems:completionHandler:主机应用程序使用结果项数组完成应用程序扩展请求。当调用该方法时,整个 ShareViewController 将被解除并释放。当您在 末尾调用此函数时didSelectPost,它会在NSItemProvider检索图像 URL 之前执行。因为这是异步发生的。要解决此问题,您必须completeRequestReturningItems:completionHandler:在之后致电NSItemProvider在检索到 imageURL
它应该是这样工作的:
- (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];
}];
}
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,没有必要使用dispatch_async顺便说一下,在使用 NSItemProvider 时
我已经写了一篇关于此的博客文章,如果您想了解更多相关内容。
编辑
您现在可以使用刚刚检索到的文件路径加载图像。这仅适用于扩展!如果您想从包含的应用程序访问图像,则无法使用刚刚检索到的文件 URL。共享扩展将所选图像保存在包含应用程序无法访问的文件夹中。
要使图像可供包含的应用程序使用,您必须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
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5936 次 |
| 最近记录: |