Guardar files PDF con Swift en iOS y mostrarlos

Quiero crear una aplicación que también incluya la posibilidad de mostrar y save files PDF dentro de la aplicación y mostrarlos (como FileSystem) dentro de una vista de tabla y abrirlos cuando toco en un PDF.

Aquí están mis preguntas importantes para eso:

1. ¿Cómo guardo un file PDF local en mi aplicación (por ejemplo, si el usuario puede ingresar una URL) y dónde exactamente lo saveá?

2. Cuando se guardan, ¿cómo puedo mostrar todos los files locales almacenados dentro de una vista de tabla para abrirlos?

Dado que varias personas lo solicitaron, aquí está el equivalente a la primera respuesta en Swift:

//The URL to Save let yourURL = NSURL(string: "http://somewebsite.com/somefile.pdf") //Create a URL request let urlRequest = NSURLRequest(URL: yourURL!) //get the data let theData = NSURLConnection.sendSynchronousRequest(urlRequest, returningResponse: nil, error: nil) //Get the local docs directory and append your local filename. var docURL = (NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)).last as? NSURL docURL = docURL?.URLByAppendingPathComponent( "myFileName.pdf") //Lastly, write your file to the disk. theData?.writeToURL(docURL!, atomically: true) 

Además, dado que este código utiliza una request de networking síncrona, recomiendo encarecidamente enviarlo a una queue de background:

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in //The URL to Save let yourURL = NSURL(string: "http://somewebsite.com/somefile.pdf") //Create a URL request let urlRequest = NSURLRequest(URL: yourURL!) //get the data let theData = NSURLConnection.sendSynchronousRequest(urlRequest, returningResponse: nil, error: nil) //Get the local docs directory and append your local filename. var docURL = (NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)).last as? NSURL docURL = docURL?.URLByAppendingPathComponent( "myFileName.pdf") //Lastly, write your file to the disk. theData?.writeToURL(docURL!, atomically: true) }) 

Y la respuesta a la segunda pregunta en Swift:

 //Getting a list of the docs directory let docURL = (NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).last) as? NSURL //put the contents in an array. var contents = (NSFileManager.defaultManager().contentsOfDirectoryAtURL(docURL!, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions.SkipsHiddenFiles, error: nil)) //print the file listing to the console println(contents) 

Estoy dando un ejemplo de almacenamiento y recuperación de un documento pdf en iOS. Espero que eso sea lo que buscas.

1. ¿Cómo guardo un file PDF local en mi aplicación (por ejemplo, si el usuario puede ingresar una URL) y dónde exactamente lo saveá?

 // the URL to save NSURL *yourURL = [NSURL URLWithString:@"http://yourdomain.com/yourfile.pdf"]; // turn it into a request and use NSData to load its content NSURLRequest *request = [NSURLRequest requestWithURL:result.link]; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; // find Documents directory and append your local filename NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; documentsURL = [documentsURL URLByAppendingPathComponent:@"localFile.pdf"]; // and finally save the file [data writeToURL:documentsURL atomically:YES]; 

2. Cuando se guardan, ¿cómo puedo mostrar todos los files locales almacenados dentro de una vista de tabla para abrirlos?

Puede verificar que el file se haya descargado, o puede listr el directory de Documentos así:

 // list contents of Documents Directory just to check NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; NSArray *contents = [[NSFileManager defaultManager]contentsOfDirectoryAtURL:documentsURL includingPropertiesForKeys:nil options:NSDirectoryEnumerationSkipsHiddenFiles error:nil]; NSLog(@"%@", [contents description]);