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

Posted

技术标签:

【中文标题】在 iOS9 中使用 UIImagePickerController 获取 iCloud 项目失败【英文标题】:Getting iCloud items with UIImagePickerController fails in iOS9 【发布时间】:2015-09-04 03:34:47 【问题描述】:

我有一个这样的代码,用于从库中获取视频,它在 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)如果是有意更改,获取资产的正确方法是什么?

感谢任何信息。

谢谢

//武士

【问题讨论】:

似乎已经不鼓励使用 UIImagePickerControllerMediaURL 获取媒体...?我发现选择器中的信息字典总是包含 UIImagePickerControllerReferenceURL 所以我添加了一个 if 分支,所以如果存在则使用 UIImagePickerControllerMediaURL,如果不存在则使用 UIImagePickerControllerReferenceURL。但我仍然不知道这是否是最好的方法。 您可能应该为此提交一份雷达文件。在集成任何涉及云同步数据的东西时,都会出现很多问题。特别是 Apple 音乐(不要让我开始了解媒体选择器如何允许选择您无法从选择中过滤掉的音乐)。 最简单和最好的解决方法是直接使用 PhotoKit。那时您几乎避免了所有意外问题,并且可以访问照片对象及其各自的状态/详细信息。 【参考方案1】:

这是将视频作为 NSData 存储在 iCloud 上的方法。 它使用 Photos 框架,因为 ALAssetLibrary 自 iOS9 起已弃用:

重要

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

【讨论】:

以上是关于在 iOS9 中使用 UIImagePickerController 获取 iCloud 项目失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS9 中使用 PHPhotolibrary 将照片保存在带有元数据的相册中?

在 iOS9 和 Swift2 中使用 Parse 登录 Facebook

在 iOS9 中强制缩放应用

iOS9:在模拟器和设备上使用动态框架

在 iOS9 中使用“hw.machine”标志调用“sysctlbyname(...)”

iOS9中开发新特性