Search code examples
ios8ios8-extensionphotokitios-extensions

Retrieve ALAsset or PHAsset from file URL


Selecting images in Photos.app to pass to an action extension seems to yield paths to images on disk (e.g.: file:///var/mobile/Media/DCIM/109APPLE/IMG_9417.JPG). Is there a way to get the corresponding ALAsset or PHAsset?

The URL looks like it corresponds to the PHImageFileURLKey entry you get from calling PHImageManager.requestImageDataForAsset. I'd hate to have to iterate through all PHAssets to find it.


Solution

  • I did what I didn't want to do and threw this dumb search approach together. It works, although it's horrible, slow and gives me memory issues when the photo library is large.

    As a noob to both Cocoa and Swift I'd appreciate refinement tips. Thanks!

    func PHAssetForFileURL(url: NSURL) -> PHAsset? {
        var imageRequestOptions = PHImageRequestOptions()
        imageRequestOptions.version = .Current
        imageRequestOptions.deliveryMode = .FastFormat
        imageRequestOptions.resizeMode = .Fast
        imageRequestOptions.synchronous = true
    
        let fetchResult = PHAsset.fetchAssetsWithOptions(nil)
        for var index = 0; index < fetchResult.count; index++ {
            if let asset = fetchResult[index] as? PHAsset {
                var found = false
                PHImageManager.defaultManager().requestImageDataForAsset(asset,
                    options: imageRequestOptions) { (_, _, _, info) in
                        if let urlkey = info["PHImageFileURLKey"] as? NSURL {
                            if urlkey.absoluteString! == url.absoluteString! {
                                found = true
                            }
                        }
                }
                if (found) {
                    return asset
                }
            }
        }
    
        return nil
    }