Abrir con file en swift

Cuando abre url que contiene safari de files PDF, pregúnteles si desea abrirlo en safari o en iBook.

Quiero hacer lo mismo, en mi proyecto tenía una vista de colección que contiene videos y fotos, quiero que el usuario elija si quiere abrir el file en la aplicación o abrirlo con otro reproductor multimedia.

Para cargar en su propia aplicación, depende de la class que esté usando para mostrar contenido en el código exacto que usaría, pero para abrir en otra aplicación, normalmente usaría un button compartir. Aquí hay un código de ejemplo que funcionará si conecta la @IBAction y @IBOutlet al mismo button de barra en su UI (y coloque un file en el fileURL que especifique):

import UIKit class ViewController: UIViewController { // UIDocumentInteractionController instance is a class property var docController:UIDocumentInteractionController! @IBOutlet weak var shareButton: UIBarButtonItem! // called when bar button item is pressed @IBAction func shareDoc(sender: AnyObject) { // present UIDocumentInteractionController if let barButton = sender as? UIBarButtonItem { docController.presentOptionsMenuFromBarButtonItem(barButton, animated: true) } else { print("Wrong button type, check that it is a UIBarButton") } } override func viewDidLoad() { super.viewDidLoad() // retrieve URL to file in main bundle if let fileURL = NSBundle.mainBundle().URLForResource("MyImage", withExtension: "jpg") { // Instantiate the interaction controller self.docController = UIDocumentInteractionController(URL: fileURL) } else { shareButton.enabled = false print("File missing! Button has been disabled") } } } 

Notas

Se utiliza un UIDocumentInteractionController para habilitar el intercambio de documentos entre su aplicación y otras aplicaciones instaladas en el dispositivo de un usuario. Es fácil de configurar siempre que recuerde tres reglas:

  1. Siempre convierta la instancia de UIDocumentInteractionController en una propiedad de class (tipo). Si solo mantiene una reference al controller durante la vida del método que se activa con el button, la aplicación se bloqueará.

  2. Configure UIDocumentInteractionController antes de presionar el button que llama al método para que no haya una espera en la que la aplicación esté esperando que aparezca el popover. Esto es importante porque mientras que la presentación del controller ocurre de forma asíncrona, la instanciación no lo hace. Y puede encontrar que hay un retraso notable para abrir el popover si arroja todo el código para la instanciación y presentación dentro de un único método llamado al presionar un button. (Al realizar la testing, puede ver una demora de todos modos porque es probable que el button de compartir se presione casi de inmediato, pero en el mundo real debería haber más time para que el controller se prepare y por lo tanto, la posibilidad de retraso es less probable).

  3. La tercera regla es que debe probar esto en un dispositivo real que no está en el simulador.

Imagen de UIDocumentInteractionController Se puede encontrar más en mi blogpost sobre el tema.

Edit: usando un UIActivityViewController

Código para usar UIActivityViewController en lugar de UIDocumentInteractionController

 import UIKit class ViewController: UIViewController { // UIDocumentInteractionController instance is a class property var activityController: UIActivityViewController! @IBOutlet weak var shareButton: UIBarButtonItem! // called when bar button item is pressed @IBAction func shareStuff(sender: AnyObject) { if let barButton = sender as? UIBarButtonItem { self.presentViewController(activityController, animated: true, completion: nil) let presCon = activityController.popoverPresentationController presCon?.barButtonItem = barButton } else { print("not a bar button!") } } override func viewDidLoad() { super.viewDidLoad() // retrieve URL to file in main bundle if let img = UIImage(named:"MyImage.jpg") { // Instantiate the interaction controller activityController = UIActivityViewController(activityItems: [img], applicationActivities: nil) } else { shareButton.enabled = false print("file missing!") } } } 

También puede agregar actividades personalizadas al UIActivityViewController y aquí está el código para agregar un button "Abrir en …" a un UIActivityViewController para que pueda cambiar a un UIDocumentInteractionController desde un UIActivityViewController.

Hice el mismo código para save un file PDF desde una URL (ya sea una URL local en el almacenamiento de su dispositivo o una URL desde algún lugar de Internet)

Aquí está el Código para Swift 3:

 @IBOutlet weak var pdfWebView: UIWebView! @IBOutlet weak var shareBtnItem: UIBarButtonItem! var pdfURL : URL! var docController : UIDocumentInteractionController! 

luego en viewDidLoad()

 // retrieve URL to file in main bundle` let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("YOUR_FILE_NAME.pdf") //Instantiate the interaction controller` self.docController = UIDocumentInteractionController(url: fileURL)` 

y en su método barButtonItem tapped (que he llamado openIn (emisor)):

 @IBAction func openIn(_ sender: UIBarButtonItem) { // present UIDocumentInteractionController` docController.presentOptionsMenu(from: sender, animated: true) } 

FYI: necesita una vista web en su storyboard si desea mostrar también el file pdf

Espero que esto ayude.