2017-04-30 7 views
7

Ich versuche Video zu teilen PHAsset über UIActivityController mit requestAVAsset. Dies funktioniert mit Messaging, aber nicht mit AirDrop, was als "Fehlgeschlagen" angezeigt wird.Sharing Video PHAsset über 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) 
     } 
}) 

Das scheint richtig UIActivityController und nur arbeiten mit bestimmten Aktivitäten zu setzen:

  • Messaging - ✔️Works, richtig Video exportiert.
  • AirDrop - ✖️Shows "Failed"
  • Dropbox - ✖️Puts auf die richtige Dropbox Ansicht, sagt noch "ein unbekannter Fehler aufgetreten"

enter image description here

Antwort

4

I‘ bei der Arbeit mit PHA-Sets in ähnlich seltsames Verhalten geraten. Ich vermute, dass dies eine (absichtliche) undokumentierte Sicherheits-/Sandbox-Beschränkung ist.

Ich konnte dieses Problem umgehen, indem Sie die zugrunde liegende Datei in ein Benutzerverzeichnis kopieren und dann die Operation für die kopierte Datei ausführen.

Ich habe dies in einer Schleife. Gelegentlich schlägt die Kopie mit einem vagen Dateiberechtigungsfehler fehl. Wenn dies der Fall ist, versuche ich es nach einigen Sekunden (unter Verwendung von DispatchQueue.main.asyncAfter). Irgendwann klappt es!

+0

Wie konnten Sie sicherstellen, dass es aus dem Ordner Dokumente gelöscht wurde, wenn Sie fertig sind? – Gizmodo

+1

Ich habe diese zwei Möglichkeiten: 1) mein Anwendungsfall war das Hochladen von Video zu S3. Ich wusste, wann es fertig war, und konnte die Datei löschen. 2) Als Sicherung habe ich eine Liste der kopierten Dateien (in NSUserDefaults) beibehalten und veraltete Dateien beim Start der App regelmäßig gelöscht. Außerdem habe ich diese Dateien in einem temporären Verzeichnis gespeichert (wie man es von 'NSFileManager.URLForDirectory (.ItemReplacementDirectory ...) 'erhält. Im schlimmsten Fall räumt iOS die Dateien schließlich auf.) –

+0

@Gizmodo können Sie die Antwort akzeptieren, wenn sie funktioniert für dich? Danke! –