2017-04-30 31 views
7

Próbuję udostępnić film PHAsset poprzez UIActivityController wykorzystaniem requestAVAsset. Działa to z Messaging, ale nie z AirDrop, co oznacza "Failed".Udostępnianie wideo PHAsset poprzez UIActivityController

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

Wydaje się prawidłowo wystawione UIActivityController i działa tylko z niektórych rodzajów działalności:

  • Messaging - ✔️Works właściwie eksportuje wideo.
  • zrzut - ✖️Shows "Failed"
  • Dropbox - ✖️Puts się prawidłowego Dropbox View, jeszcze mówi "Nieznany błąd"

enter image description here

Odpowiedz

4

I” przebiegają podobnie dziwne zachowanie podczas pracy z PHAssets. Domyślam się, że jest to (celowo) nieudokumentowane ograniczenie bezpieczeństwa/piaskownicy.

Udało mi się obejść ten problem, kopiując plik bazowy do katalogu użytkownika, a następnie wykonując operację na skopiowanym pliku.

Zrobiłem to w pętli. Czasami kopiowanie kończy się niepowodzeniem z niepoprawnym błędem uprawnień do pliku. Kiedy to zrobi, ponawiam go po kilku sekundach (używając DispatchQueue.main.asyncAfter). W końcu to działa!

+0

Jak udało Ci się upewnić, że jest on usunięty z folderu Dokumenty po zakończeniu? – Gizmodo

+1

Zrobiłem to na dwa sposoby: 1) moim przypadkiem użycia było przesyłanie wideo do S3. Wiedziałem, kiedy to się skończyło i mogłem usunąć plik. 2) Jako kopię zapasową utrzymałem listę skopiowanych plików (w NSUserDefaults) i okresowo usunąłem nieaktualne pliki podczas uruchamiania aplikacji. Ponadto zapisałem te pliki w katalogu tymczasowym (uzyskanym z 'NSFileManager.URLForDirectory (.ItemReplacementDirectory ...)'. W najgorszym przypadku iOS wyczyści pliki w końcu. –

+0

@Gizmodo możesz zaakceptować odpowiedź, jeśli działa dla ciebie? Dzięki! –

Powiązane problemy