Acceso a lectura de la biblioteca de fotos de iOS

Después de que el usuario nos dio permiso para acceder a su Camera Roll. Nos gustaría tomar los datos y uploadlos a nuestros services desde nuestra aplicación. ¿Hay alguna forma de acceder a los datos de video del file? La única forma de abrir el file de video es crear un AVAsset. Pero eso no es suficiente para mí.

Estoy consciente

func requestExportSessionForVideo(_ asset: PHAsset!, options options: PHVideoRequestOptions!, exportPreset exportPreset: String!, resultHandler resultHandler: ((AVAssetExportSession!, [NSObject : AnyObject]!) -> Void)!) -> PHImageRequestID 

Pero en mi caso solo quiero upload el video a nuestro service que no quiero hacer:

  1. primero copie el video haciendo una export a los datos de mi aplicación local
  2. y luego envíe esos datos a nuestro service.
  3. eliminar los datos

Este enfoque anterior utiliza mucho espacio y time extra y los usuarios con iPhones de 16 GB completos no funcionan bien.

Ok, esto es lo que he intentado hasta ahora con la URL

 var anAcces = sourceURL?.startAccessingSecurityScopedResource if !NSFileManager.defaultManager().fileExistsAtPath(sourceURL!.path!) { NSLog("not exist") } var aFileCoordinator = NSFileCoordinator(filePresenter:nil) var anError: NSError? aFileCoordinator.coordinateReadingItemAtURL(sourceURL!, options:.ForUploading, error:&anError, byAccessor: { (newURL: NSURL!) -> Void in var data = NSData(contentsOfURL: newURL) }) if let unError = anError { NSLog("Error \(unError)") } sourceURL?.stopAccessingSecurityScopedResource 

Esto registra lo siguiente:

 2015-02-08 16:20:01.947 Cameo[15706:2288691] not exist 2015-02-08 16:20:01.991 Cameo[15706:2288691] Error Error Domain=NSCocoaErrorDomain Code=257 "The operation couldn't be completed. (Cocoa error 257.)" UserInfo=0x170876480 {NSURL=file:///var/mobile/Media/DCIM/100APPLE/IMG_0155.MOV, NSFilePath=/var/mobile/Media/DCIM/100APPLE/IMG_0155.MOV, NSUnderlyingError=0x17005a9a0 "The operation couldn't be completed. Operation not permitted"} 

Gracias a la sugerencia de Paul, lo descubrí:

Debe crear una session de request PHImageManager AVAssetForVideo en ese bloque, tendrá acceso al file y leerá sus datos desde la url.

  let imageManager = PHImageManager.defaultManager() let videoRequestOptions = PHVideoRequestOptions() videoRequestOptions.deliveryMode = .HighQualityFormat videoRequestOptions.version = .Current videoRequestOptions.networkAccessAllowed = true videoRequestOptions.progressHandler = { (progress: Double, error: NSError!, stop: UnsafeMutablePointer<ObjCBool>, [NSObject : AnyObject]!) -> Void in NSLog("Progress: %@", progress.description) } videoRequestOptions.progressHandler = { (progress: Double, error: NSError!, stop: UnsafeMutablePointer<ObjCBool>, [NSObject : AnyObject]!) -> Void in NSLog("Progress: %@", progress.description) } imageManager.requestAVAssetForVideo(nextAsset, options: videoRequestOptions, resultHandler: { (avAsset: AVAsset!, avAudioMix: AVAudioMix!, info: [NSObject : AnyObject]!) -> Void in if let nextURLAsset = avAsset as? AVURLAsset { let sourceURL = nextURLAsset.URL if NSFileManager.defaultManager().fileExistsAtPath(sourceURL.path!) { NSLog("exist file") } var data = NSData(contentsOfURL: sourceURL) if let aData = data { NSLog("length : <\(aData.length)") } else { NSLog("no data read.") } } }