2017-02-24 1 views
4

Comment enregistrer une photo dans une photothèque avec des métadonnées de géolocalisation?Enregistrer une photo avec des données de géolocalisation dans la photothèque Swift 3

J'ai demandé (et autorisé) l'application pour accéder à l'emplacement de l'utilisateur:

private func allowAccessToUserLocation() { 

     locationManager = CLLocationManager() 
     locationManager.delegate = self 
     locationManager.requestWhenInUseAuthorization() 
    } 

Ai-je besoin de demander premissions spécifiques pour l'application appareil photo?

EDIT:

J'utilise UIImagePickerController pour prendre des photos à partir de l'application. Toutes les photos prises depuis l'application sont stockées dans la photothèque SANS la géolocalisation.

Est-ce que cela a quelque chose à voir avec la façon dont je sauvegarde l'image dans une photothèque? Est-ce mon problème ici plutôt que dans les autorisations de localisation de base?

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()}) 
     } 
    } 
+0

Je ne comprends pas quelle est la relation entre l'emplacement et les photos dans la bibliothèque de photos? Pouvez-vous s'il vous plaît réviser votre question et la corriger pour être plus claire. – hasan83

+0

pouvez-vous s'il vous plaît ajouter le code où vous avez lu les données de géolocalisation? – hasan83

+0

avez-vous imprimé l'emplacement avant de modifierGeoCodeLocation? quelle est la valeur? – hasan83

Répondre

1

Eh bien, je suppose que vous devez accéder à l'emplacement de l'utilisateur avant de vous appeler func addAsset(image: UIImage, location: CLLocation? = nil) {...}

donc quelque part dans le func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {....}

J'appelle:

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) 

une fois que je termine avec le :

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

i arrête la mise à jour de l'emplacement:

locationManager.stopUpdatingLocation() 

Cela fonctionne pour moi

3

Dans iOS 8 Apple a introduit Photo Library.

Voici l'exemple pour créer et mettre à jour PHAsset avec emplacement:

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

Assurez-vous de l'autorisation d'accéder aux photos avant d'enregistrer avec

PHPhotoLibrary.requestAuthorization(_:) 

Les métadonnées peuvent être lu avec:

info[UIImagePickerControllerMediaMetadata] 

Je ne suis pas en mesure de vérifier que les métadonnées stockent l'emplacement, en mon test PAS même avec le service de localisation autorisé. Dans ce cas, l'utilisation pourrait obtenir un emplacement réel par vous-même en utilisant CoreLocation.

+0

cette ligne a une erreur ... asset.location = location '(la valeur de type PHObjectPlaceholder n'a pas d'emplacement de membre)' –

+0

désolé, vérifiez modifier, j'ai simplifié la réponse en supprimant les collections d'albums – XeNoN