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

3

我有一段获取库中视频的代码,它在 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 值为 nil,因此获取资产失败。
那么我的问题是: (1)是否有任何关于这种行为变化的官方说明? (2)如果这是一种有意的更改,正确的获取资产的方法是什么?
非常感谢您提供的任何信息。
谢谢!
// Takeshi

似乎使用UIImagePickerControllerMediaURL获取媒体已经不被鼓励了...?我发现选择器的信息字典始终包含UIImagePickerControllerReferenceURL,因此我添加了一个if分支,这样你就可以使用UIImagePickerControllerMediaURL(如果存在)并使用UIImagePickerControllerReferenceURL(如果不存在)。但我仍然不知道这是否是最好的方法。 - Takeshi Yokemura
你应该为此提交一个雷达反馈。在集成任何涉及云同步数据的东西时,会出现相当多的问题,尤其是苹果音乐(别让我开始谈媒体选择器如何允许选择无法过滤的音乐)。 - TheCodingArt
最简单和最好的解决方法是直接使用PhotoKit。这样,您基本上避免了所有意外问题,并可以访问照片对象及其各自的状态/详细信息。 - TheCodingArt
1个回答

1

以下是将存储在iCloud上的视频转换为NSData的方法。由于iOS9已经弃用了ALAssetLibrary,因此使用Photos框架:

重要提示

Assets Library框架已在iOS 9.0中弃用。相反,请改用Photos框架,在iOS 8.0及更高版本中,该框架提供了更多功能和更好的性能,可用于处理用户的照片库。有关更多信息,请参阅Photos Framework参考。

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")
                    }
                }
            })
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接