我正在为我的iOS应用程序开发照片的共享扩展.在扩展内部,我能够从NSItemProvider成功检索UIImage对象.
但是,我希望能够与我的容器应用程序共享图像,而不必将整个图像数据存储在我的共享用户默认值中.有没有办法获得用户在共享扩展中选择的图像的PHAsset(如果他们从他们的设备中选择)?
照片框架上的文档(https://developer.apple.com/library/ios/documentation/Photos/Reference/Photos_Framework/)有一句话说"这种架构使得使用它的过程变得简单,安全和高效来自多个线程或多个应用和应用扩展的相同资产."
这条线让我觉得有一种方法可以在扩展和容器应用程序之间共享相同的PHAsset,但我还没有找到任何方法来做到这一点?有没有办法做到这一点?
如果图像是从照片应用程序共享的,您可以获得PHAsset.项目提供程序将为您提供包含图像文件名的URL,您可以使用它来匹配PHAsset.
/// Assets that handle through handleImageItem:completionHandler: private var handledAssets = [PHAsset]() /// Key is the matched asset's original file name without suffix. E.g. IMG_193 private lazy var imageAssetDictionary: [String : PHAsset] = { let options = PHFetchOptions() options.includeHiddenAssets = true let fetchResult = PHAsset.fetchAssetsWithOptions(options) var assetDictionary = [String : PHAsset]() for i in 0 ..< fetchResult.count { let asset = fetchResult[i] as! PHAsset let fileName = asset.valueForKey("filename") as! String let fileNameWithoutSuffix = fileName.componentsSeparatedByString(".").first! assetDictionary[fileNameWithoutSuffix] = asset } return assetDictionary }() ... provider.loadItemForTypeIdentifier(imageIdentifier, options: nil) { imageItem, _ in if let image = imageItem as? UIImage { // handle UIImage } else if let data = imageItem as? NSData { // handle NSData } else if let url = imageItem as? NSURL { // Prefix check: image is shared from Photos app if let imageFilePath = imageURL.path where imageFilePath.hasPrefix("/var/mobile/Media/") { for component in imageFilePath.componentsSeparatedByString("/") where component.containsString("IMG_") { // photo: /var/mobile/Media/DCIM/101APPLE/IMG_1320.PNG // edited photo: /var/mobile/Media/PhotoData/Mutations/DCIM/101APPLE/IMG_1309/Adjustments/FullSizeRender.jpg // cut file's suffix if have, get file name like IMG_1309. let fileName = component.componentsSeparatedByString(".").first! if let asset = imageAssetDictionary[fileName] { handledAssets.append(asset) imageCreationDate = asset.creationDate } break } } }
仅当NSItemProvider为您提供格式为的URL时,此方法才有效:
file:///var/mobile/Media/DCIM/100APPLE/IMG_0007.PNG
对于您的所有资产并非总是如此,但如果它返回的URL如下:
file:///var/mobile/Media/PhotoData/OutgoingTemp/2AB79E02-C977-4B4A-AFEE-60BC1641A67F.JPG
然后PHAsset将永远找不到您的资产.此外,后者是您的文件的副本,因此如果您碰巧有一个非常大的图像/视频,iOS将在该OutgoingTemp
目录中复制它.在文档中没有任何地方说它什么时候会被删除,希望很快就会被删除.
我认为这是Apple在Sharing Extensions和PHPhotoLibrary框架之间留下的一个巨大差距.Apple应该很快创建一个API来关闭它.