将地理位置数据保存到照片库Swift 3

如何使用地理定位元数据将照片保存到照片库?

我已请求(并允许)该应用访问用户位置:

private func allowAccessToUserLocation() { locationManager = CLLocationManager() locationManager.delegate = self locationManager.requestWhenInUseAuthorization() } 

我是否需要询问相机应用程序的具体预设?

编辑:

我使用UIImagePickerController从应用程序中拍摄照片。 从应用程序中拍摄的所有照片都存储在照片库中,没有地理位置。

这与我将图像保存到照片库的方式有什么关系吗? 我的问题在这里而不是在核心位置权限?

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage{ UIImageWriteToSavedPhotosAlbum(pickedImage, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil) dismiss(animated: true, completion: { self.showPhoto()}) } } 

在iOS 8中,Apple推出了Photo Library 。

以下是使用location创建和更新PHAsset的示例:

 func addAsset(image: UIImage, location: CLLocation? = nil) { PHPhotoLibrary.shared().performChanges({ // Request creating an asset from the image. let creationRequest = PHAssetChangeRequest.creationRequestForAsset(from: image) // Set metadata location if let location = location { creationRequest.location = location } }, completionHandler: { success, error in if !success { NSLog("error creating asset: \(error)") } }) } 

在保存之前,请确保您有权访问照片

 PHPhotoLibrary.requestAuthorization(_:) 

可以使用以下内容读取元数据:

 info[UIImagePickerControllerMediaMetadata] 

我无法在我的测试中validation元数据存储位置,即使在允许位置服务的情况下也是如此。 在这种情况下,使用CoreLocation可以自己获得真正的位置。

好吧,我猜你需要在调用func addAsset(image: UIImage, location: CLLocation? = nil) {...}之前先访问用户的位置func addAsset(image: UIImage, location: CLLocation? = nil) {...}

所以在func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {....}某个地方func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {....}

我打电话给:

  let locationManager = CLLocationManager() if CLLocationManager.locationServicesEnabled() { locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters locationManager.startUpdatingLocation() } else{ //Location service disabled" } //and then call.... addAsset(image: pickedImage, location: locationManager.location) 

一旦我完成了:

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {...} 

我停止更新位置:

  locationManager.stopUpdatingLocation() 

这对我有用