2016-01-13 17 views
6

ALAssetsLibrary không được dùng nữa trong những ngày này nhưng thực tế tất cả các ví dụ về SO vẫn đang sử dụng. Đối với mục tiêu của mình, tôi cần biết URL của video đã được thêm vào Thư viện ảnh để tôi có thể chia sẻ video với ứng dụng Instagram (đó là cách duy nhất mà Instagram chấp nhận video). URL có lẽ nên bắt đầu với "tài sản thư viện: // ..."Nhận URL của nội dung mới được tạo, phong cách iOS 9

Đây là đơn giản với ALAssetsLibrary:

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

Ở trên, URL được chuyển như một cuộc tranh cãi với khối hoàn thành. Nhưng còn cách tương thích với iOS 9 với phương thức PHPhotoLibrary và phương thức performChanges thì sao?

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? 
    } 
}) 
+0

Tại sao bạn không chỉ cần bạn lưu video cục bộ trước khi chia sẻ nó? –

+0

@LeoDabus Cách chia sẻ video, Instagram sẽ không thể đọc video từ hộp cát của ứng dụng của tôi –

Trả lời

16

Dưới đây là những gì tôi đã kết thúc với:

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

Hoạt động đẹp mắt. – 209135

4

Nice câu trả lời và giả, nhờ Desmond.

Dưới đây là một câu trả lời Cập nhật:

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

Đi thêm

Mặc dù điều này hoạt động hoàn hảo cho thời điểm này, bất cứ ai có thể biết một cách "sạch" để nhận URL "tài sản-thư viện" này, không có giải pháp "thủ công" này?

tôi thấy interesting thread này, nhưng nó chỉ đưa ra một "file: /// var/..." URL

Các vấn đề liên quan