2017-04-30 133 views
7

我想分享視頻PHAsset通過UIActivityController使用requestAVAsset。這適用於消息處理,但不適用於AirDrop,指示爲「失敗」。通過UIActivityController共享視​​頻PHAsset

PHCachingImageManager.default().requestAVAsset(forVideo: asset, options: nil, resultHandler: 
    { (givenAsset, audioMix, info) in 

     let videoAsset = givenAsset as! AVURLAsset 
     let videoURL = videoAsset.url 

     DispatchQueue.main.async { 
      let activityViewController = UIActivityViewController(
       activityItems: [videoURL], 
       applicationActivities: nil) 
      activityViewController.excludedActivityTypes = [UIActivityType.saveToCameraRoll] 

      if let popoverPresentationController = activityViewController.popoverPresentationController { 
       popoverPresentationController.barButtonItem = (sender) 
      } 

      self.present(activityViewController, animated: true, completion: nil) 
     } 
}) 

這似乎是正確豎起UIActivityController,只與某些活動的工作:

  • 消息 - ✔️Works,正常出口的視頻。
  • 空投 - ✖️Shows 「失敗」
  • Dropbox的 - ✖️Puts了正確的Dropbox的視圖,但表示, 「發生未知錯誤」

enter image description here

回答

4

我在使用PHAssets時遇到類似的奇怪行爲。我的猜測是這是一個(故意)未記錄的安全/沙盒限制。

我能夠通過將底層文件複製到用戶目錄,然後對複製的文件執行操作來解決此問題。

我在一個循環中做了這個。有時候,複製失敗,模糊的文件權限錯誤。當它發生時,我會在幾秒後重試它(使用DispatchQueue.main.asyncAfter)。最終,它的工作!

+0

您是如何確保在完成後將其從Documents文件夾中刪除的? – Gizmodo

+1

我這樣做了兩種方法:1)我的用例是將視頻上傳到S3。我知道它何時完成,並可能刪除該文件。 2)作爲備份,我保存了複製文件的列表(在NSUserDefaults中),並在應用程序啓動時定期刪除舊文件。另外,我將這些文件存儲在一個臨時目錄中(如從'NSFileManager.URLForDirectory(.ItemReplacementDirectory ...)'中獲得的),最糟糕的情況是,iOS最終會清理文件 –

+0

@Gizmodo如果可以的話,你可以接受爲你?謝謝! –