web-dev-qa-db-ja.com

新しく作成されたアセットのURLを取得するiOS9スタイル

ALAssetsLibraryは最近廃止されましたが、SOのほとんどすべての例はまだそれを利用しています。私の目的のために、に追加されたビデオのURLを知る必要がありますフォトライブラリを使用して、Instagramアプリとビデオを共有できます(Instagramがビデオを受け入れる唯一の方法です)。URLはおそらく「assets-library:// ...」で始まる必要があります。

これはALAssetsLibraryで簡単です。

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

上記では、URLは引数として完了ブロックに渡されます。しかし、PHPhotoLibraryクラスとperformChangesメソッドを使用したiOS9互換の方法はどうでしょうか。

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?
    }
})
13
Desmond Hume

これが私が最終的に得たものです:

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
    }
})
23
Desmond Hume

いい答えと疑似、デズモンドに感謝します。

これが更新された答えです:

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)
            }
        }
    })

さらに進む

これは今のところ完全に機能しますが、この「手動」ソリューションなしで、この「assets-library」URLを取得する「よりクリーンな」方法を知っている人はいますか?

私はこれを見つけました 興味深いスレッド 、しかしそれは「file:/// var/...」URLしか与えません

4
Matthieu