Cómo cargar PDF local en UIWebView en Swift

Así que actualmente estoy intentando mostrar un PDF local que tengo en UIWebview y este es el código que estoy usando:

@IBOutlet weak var webView:UIWebView! override func viewDidLoad() { super.viewDidLoad() var pdfLoc = NSURL(fileURLWithPath:NSBundle.mainBundle().pathForResource("Sample", ofType:"pdf")!) var request = NSURLRequest(URL: pdfLoc); self.webView.loadRequest(request); } 

El código se buildá correctamente, pero cuando ejecuto la aplicación, se bloqueará con el error: Thread 1: EXC_BAD_INSTRUCTION (code = EXC-I386_INVOP, subcode = 0x0)

He encontrado algunos tutoriales sobre cómo hacer esto, pero todos están muy obsoletos o en Objective-C.

Aqui tienes:

 if let pdf = NSBundle.mainBundle().URLForResource("myPDF", withExtension: "pdf", subdirectory: nil, localization: nil) { let req = NSURLRequest(URL: pdf) let webView = UIWebView(frame: CGRectMake(20,20,self.view.frame.size.width-40,self.view.frame.size.height-40)) webView.loadRequest(req) self.view.addSubview(webView) } 

Editar

La alternativa es a través de NSData:

 if let pdfURL = NSBundle.mainBundle().URLForResource("myPDF", withExtension: "pdf", subdirectory: nil, localization: nil),data = NSData(contentsOfURL: pdfURL), baseURL = pdfURL.URLByDeletingLastPathComponent { let webView = UIWebView(frame: CGRectMake(20,20,self.view.frame.size.width-40,self.view.frame.size.height-40)) webView.loadData(data, MIMEType: "application/pdf", textEncodingName:"", baseURL: baseURL) self.view.addSubview(webView) } 

Apple se empeña en aconsejarle que no use .loadRequest para files HTML locales, aunque no lo extiende a otros types de datos. Entonces, he proporcionado la ruta NSData arriba. Si desea especificar textEncodingName, puede ser "utf-8", "utf-16", etc.

Editar: Swift 3

Aquí hay una versión Swift 3 del código que usa, como recomienda Apple, WKWebView en lugar de UIWebView.

 import UIKit import WebKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. if let pdfURL = Bundle.main.url(forResource: "myPDF", withExtension: "pdf", subdirectory: nil, localization: nil) { do { let data = try Data(contentsOf: pdfURL) let webView = WKWebView(frame: CGRect(x:20,y:20,width:view.frame.size.width-40, height:view.frame.size.height-40)) webView.load(data, mimeType: "application/pdf", characterEncodingName:"", baseURL: pdfURL.deletingLastPathComponent()) view.addSubview(webView) } catch { // catch errors here } } } } 

Para Xcode 8.1 y Swift 3.0

Guarde el file PDF en cualquier carpeta de su xcode. Supongamos que el nombre del file es 'Filename.pdf'

  if let pdf = Bundle.main.url(forResource: "Filename", withExtension: "pdf", subdirectory: nil, localization: nil) { let req = NSURLRequest(url: pdf) webViewPresentation.loadRequest(req as URLRequest) } 

Lo mismo se aplicará si desea abrir cualquier file html.

Actualizado para Swift 3

 import UIKit import WebKit class ViewController: UIViewController { let webView = WKWebView() override func viewDidLoad() { super.viewDidLoad() loadPdf() setupViews() } func loadPdf() { if let pdfUrl = Bundle.main.url(forResource: "YourPdfFileName", withExtension: "pdf", subdirectory: nil, localization: nil) { do { let data = try Data(contentsOf: pdfUrl) webView.load(data, mimeType: "application/pdf", characterEncodingName:"", baseURL: pdfUrl.deletingLastPathComponent()) print("pdf file loading...") } catch { print("failed to open pdf") } return } print("pdf file doesn't exist") } func setupViews() { title = "View PDF Demo" view.backgroundColor = .white view.addSubview(webView) // setup AutoLayout... webView.translatesAutoresizingMaskIntoConstraints = false webView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true webView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true webView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true webView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true } } 

introduzca la descripción de la imagen aquí

Importar WebKit

aquí puede cargar su pdf en su aplicación

  override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. if let pdfURL = Bundle.main.url(forResource: "food-and-drink-menu-trafalgar-tavern", withExtension: "pdf", subdirectory: nil, localization: nil) { do { let data = try Data(contentsOf: pdfURL) let webView = WKWebView(frame: CGRect(x:0,y:NavigationView.frame.size.height,width:view.frame.size.width, height:view.frame.size.height-NavigationView.frame.size.height)) webView.load(data, mimeType: "application/pdf", characterEncodingName:"", baseURL: pdfURL.deletingLastPathComponent()) view.addSubview(webView) } catch { // catch errors here } } } 

Para Swift 3 usa este código:

 let url = URL(fileURLWithPath: filePath) let urlRequest = URLRequest(url: url) webView?.loadRequest(urlRequest)