2015-02-08 82 views
4

用户授予我们访问其相机权限的权限后。我们希望获取数据并从应用内将其上传到我们的服务中。 有没有办法从文件中访问视频数据?打开视频文件的唯一方法是创建一个AVAsset。但这对我来说还不够。iOS Photo Library阅读权限

我知道断

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

但在我来说,我只是想将视频上传到我们的服务,我不想做的事:

  1. 第一个副本的视频做导入我的本地应用数据
  2. 然后将该数据发送到我们的服务。
  3. 删除数据。

上面的这个方法使用了大量的额外的空间和时间,用户使用全部16GB的iPhone,它不能很好地工作。

确定这是我试过到目前为止使用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 

这将记录如下:

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"} 
+0

您应该可以从AVAsset获取URL,然后将其传递给您的上传者。自从我看了这个以来已经有一段时间了。看看我的问题/答案。我想有人建议了一些可能适合你的东西。 – 2015-02-08 19:33:40

+0

我用我用来访问URL的代码更新了我的问题。我试过2种技术:NSFileManager和NSFileCoordinator – mvo 2015-02-08 21:30:10

+1

请参阅http://stackoverflow.com/a/26144019/1050482 – 2015-02-09 13:12:11

回答

1

感谢保罗建议,我想通了:

你必须在该块中创建一个PHImageManager requestAVAssetForVideo会话,您可以访问该文件并从该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.") 
      } 
     } 
    } 
+1

请参阅上面的问题的评论...读入NSData对象的工作,但试图从AVURLAsset的URL创建一个NSURLSessionUploadTask会引发错误:'无法发布文件文件的沙箱扩展: ///var/mobile/Media/DCIM/100APPLE/IMG_0730.MOV,errno = 1'。关于如何解决这个问题或者为什么可能会发生的任何想法? – 2015-02-10 16:43:54

+0

Tumblr看到类似的错误,虽然从URL构造不同:https://github.com/tumblr/ios-extension-issues/blob/master/samples/BackgroundSessionErrors/ShareExtension/ShareViewController.m – 2015-02-10 16:46:57

+0

我得到同样的错误作为Alfie的消息:“无法发布文件的沙盒扩展......”。任何解决方案? – Alyoshak 2017-11-15 20:11:58