UIImagePickerControllerReferenceURL返回nil,导致应用程序崩溃

时间:2014-11-07 13:34:03

标签: ios swift uiimagepickercontroller

我正在尝试在imagePickerController中打印所有图像元数据:didFinishPickingMediaWithInfo函数。当我使用info.objectForKey(UIImagePickerControllerReferenceURL)方法时,它返回nil,如果尝试使用此结果,我的应用程序崩溃。有谁知道为什么它会返回nil以及我在选择图像时还能用什么来打印所有图像元数据? (使用UIImageJPEGRepresentation不是一个选项,因为删除了EXIF数据)。 这是我的代码:

func imagePickerController(picker: UIImagePickerController!, didFinishPickingMediaWithInfo info:     NSDictionary!)
{
let image = info.objectForKey(UIImagePickerControllerOriginalImage) as UIImage

let refURL : NSURL = info.objectForKey(UIImagePickerControllerReferenceURL) as NSURL
var localSourceRef: CGImageSourceRef = CGImageSourceCreateWithURL(refURL, nil)
var localMetadata: NSDictionary = CGImageSourceCopyPropertiesAtIndex(localSourceRef, 0, nil)
println("\n Photo data: \n")
println(localMetadata) 
}

1 个答案:

答案 0 :(得分:2)

所以听起来这里实际上有两个问题:

1)为什么UIImagePickerControllerReferenceURL返回一个nil引用?

2)如何从照片中获取位置数据?

所以,(1)的答案通常是因为你在操作系统之前收到回调didFinishPickingMedia,因为它将文件写入图像库。

#2的答案要复杂得多,正如这个问题的答案所展示的那样: Reading the GPS data from the image returned by the camera in iOS iphone

您需要考虑许多变量:

  • 如果您未请求访问位置数据,iOS将删除GPS数据,因此您需要使用CLLocationManager提示进行位置访问。
  • 如果用户已禁用地理标记,则您永远不会获得GPS坐标。
  • 如果手机无法获得GPS锁定,iOS将不会记录GPS坐标。

根据这个答案:https://stackoverflow.com/a/10338012/490180你应该能够检索原始UIImage,然后从UIImage的CGImage的data属性创建CGImageSourceRef。这有效地消除了您访问ReferenceURL的需要。