Get URL of a newly created asset, iOS 9 style

為{幸葍}努か 提交于 2019-11-29 02:49:59

问题


ALAssetsLibrary is deprecated these days but practically all examples on SO are still making use of it. For my objective, I need to know the URL of the video that was added to the Photo Library so I could share a video to the Instagram app (that's the only way in which Instagram accepts videos). The URL should probably start with "assets-library://..."

This is simple with ALAssetsLibrary:

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeVideoAtPathToSavedPhotosAlbum:videoFilePath completionBlock:^(NSURL *assetURL, NSError *error) {  // ...

Above, the URL is passed as an argument to the completion block. But what about iOS 9 compatible way with PHPhotoLibrary class and performChanges method?

var videoAssetPlaceholder:PHObjectPlaceholder!  // property

// ...

let videoURL = NSBundle.mainBundle().URLForResource("Video_.mp4", withExtension: nil)!

let photoLibrary = PHPhotoLibrary.sharedPhotoLibrary()
photoLibrary.performChanges({
    let request = PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(videoURL)
    self.videoAssetPlaceholder = request?.placeholderForCreatedAsset
},
completionHandler: { success, error in
    if success
    {
        // The URL of the video asset?
    }
})

回答1:


Here's what I've ended up with:

let videoURL = NSBundle.mainBundle().URLForResource("Video_.mp4", withExtension: nil)!

let photoLibrary = PHPhotoLibrary.sharedPhotoLibrary()
var videoAssetPlaceholder:PHObjectPlaceholder!
photoLibrary.performChanges({
    let request = PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(videoURL)
    videoAssetPlaceholder = request!.placeholderForCreatedAsset
},
completionHandler: { success, error in
    if success {
        let localID = videoAssetPlaceholder.localIdentifier
        let assetID =
            localID.stringByReplacingOccurrencesOfString(
                "/.*", withString: "",
                options: NSStringCompareOptions.RegularExpressionSearch, range: nil)
        let ext = "mp4"
        let assetURLStr =
            "assets-library://asset/asset.\(ext)?id=\(assetID)&ext=\(ext)"

        // Do something with assetURLStr
    }
})



回答2:


Nice answer and pseudo, thanks Desmond.

Here is an updated answer :

Swift 3

var assetPlaceholder: PHObjectPlaceholder!
    PHPhotoLibrary.shared().performChanges({
        let assetRequest = PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: videoURL as URL!)
        assetPlaceholder = assetRequest?.placeholderForCreatedAsset
    }, completionHandler: { (success, error) in
        if success {
            let localID = assetPlaceholder.localIdentifier
            let assetID = localID.replacingOccurrences(of: "/.*", with: "", options: NSString.CompareOptions.regularExpression, range: nil)
            let ext = "mp4"
            let assetURLStr = "assets-library://asset/asset.\(ext)?id=\(assetID)&ext=\(ext)"

            // Do what you want with your assetURLStr
        } else {
            if let errorMessage = error?.localizedDescription {
                print(errorMessage)
            }
        }
    })

Going further

Although this works perfectly for the moment, would anyone know a "cleaner" way to get this "assets-library" URL, without this "manual" solution ?

I found this interesting thread, but it only gives a "file:///var/..." URL



来源:https://stackoverflow.com/questions/34774807/get-url-of-a-newly-created-asset-ios-9-style

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!