使用UIImagePickerController获取iCloud项目在iOS9中失败

时间:2015-09-04 03:34:48

标签: ios icloud

我有一个这样的代码用于从图书馆获取视频,它在iOS 8.x上完美运行但是当你获得一个位于云端的项目时它在iOS9中失败了(并且是尚未下载)。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

  NSString *mediaType = info[UIImagePickerControllerMediaType];
  if ([mediaType isEqualToString:(NSString *) kUTTypeMovie]) {
    NSURL *url = info[UIImagePickerControllerMediaURL];
    NSData *data = [NSData dataWithContentsOfURL:url]
    .
    .
    .
  }
}

iOS8上,图像选择器在选择视频后显示“压缩视频”进度条,然后在完成控制后返回到我的应用程序。

当它在iOS9上失败时,“压缩视频”栏立即消失,控件同时返回我的应用程序。在这种情况下, UIImagePickerControllerMediaURL值变为零,从而导致资产失败。

然后我的问题是: (1)有关于这种行为改变的官方提及吗? (2)如果是故意改变什么是获得资产的正确方法?

感谢任何信息。

由于

// Takeshi

1 个答案:

答案 0 :(得分:1)

以下是将视频存储在iCloud上作为NSData的方法。 它使用Photos框架,因为从iOS9开始不推荐使用ALAssetLibrary:

  

重要

     

从iOS 9.0开始,不推荐使用Assets Library框架。相反,请使用Photos框架,在iOS 8.0及更高版本中,它可以为用户的照片库提供更多功能和更好的性能。有关更多信息,请参阅照片框架参考。

import Photos

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    self.dismissViewControllerAnimated(true, completion: nil)

    if let referenceURL = info[UIImagePickerControllerReferenceURL] as? NSURL {
        let fetchResult = PHAsset.fetchAssetsWithALAssetURLs([referenceURL], options: nil)
        if let phAsset = fetchResult.firstObject as? PHAsset {
            PHImageManager.defaultManager().requestAVAssetForVideo(phAsset, options: PHVideoRequestOptions(), resultHandler: { (asset, audioMix, info) -> Void in
                if let asset = asset as? AVURLAsset {
                    let videoData = NSData(contentsOfURL: asset.URL)

                    // optionally, write the video to the temp directory
                    let videoPath = NSTemporaryDirectory() + "tmpMovie.MOV"
                    let videoURL = NSURL(fileURLWithPath: videoPath)
                    let writeResult = videoData?.writeToURL(videoURL, atomically: true)

                    if let writeResult = writeResult where writeResult {
                        print("success")
                    }
                    else {
                        print("failure")
                    }
                }
            })
        }
    }
}