Photo capture des problèmes d'autorisation dans iOS 11

Alors, voici mon problème. Je suis en train de créer un écran dans lequel il y a une UIImageView et un UIButton. Lorsque l'utilisateur appuie sur le bouton, l'application appareil photo s'ouvre, vous prenez une photo et si vous appuyez sur "Utiliser la Photo" dans l'application Appareil photo, vous êtes retourné à mon app de l'écran et la photo est placé dans le UIImageView je l'ai mentionné précédemment.

Ce qui se passe est que lorsque j'appuie sur la "Photo" bouton, l'image est correctement placé dans mon UIImageView mais ensuite, l'application se bloque avec le message d'erreur suivant:

Cette application s'est écrasé parce qu'il a tenté d'accéder à la confidentialité des données sensibles sans une description de l'utilisation. L'application Info.plist doit contenir un NSPhotoLibraryAddUsageDescription clé avec une valeur de chaîne expliquant à l'utilisateur comment l'application utilise ces données.

Ce que j'ai fait jusqu'à présent est:

  1. Placé la clé de la "vie privée - Bibliothèque de Photos, une Description de l'Utilisation" avec la valeur "$(PRODUIT_NOM) utilise la Bibliothèque afin de traiter les photos que vous avez capturé." dans l'Info.fichier plist (également vérifié la façon dont il est écrit sous forme de code Source et il est correct d'après le site Apple Developer Documentation).
  2. Également placé la clé de "la vie privée - l'Usage de la Caméra Description" avec la valeur "$(PRODUIT_NOM) utilise des Caméras" dans l'Info.fichier plist.
  3. Vérifiée sous "OBJECTIFS->->Info->Custom iOS Cible Propriétés" et les 2 paires clé/valeur que je l'ai mentionné dans les étapes 1 et 2, existent.

Je vous donnerai mon code pour l'instant:

import UIKit
import Vision
import MobileCoreServices
import AVFoundation
import Photos
class ViewController: UIViewController, UIImagePickerControllerDelegate, 
UINavigationControllerDelegate {
var newMedia: Bool?
@IBAction func captureImageButtonPressed(_ sender: Any) {
//let imageName : String = "dolphin"
    //randomImageView.image = UIImage.init(named:imageName)

if UIImagePickerController.isSourceTypeAvailable(
UIImagePickerControllerSourceType.camera) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType =
UIImagePickerControllerSourceType.camera
imagePicker.mediaTypes = [kUTTypeImage as String]
imagePicker.allowsEditing = false
self.present(imagePicker, animated: true,
completion: nil)
newMedia = true
}
}
@IBAction func classifyButtonPressed(_ sender: UIButton) {
performVisionRequest()
}
@IBOutlet weak var randomImageView: UIImageView!
@IBOutlet weak var classificationLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
}
func performVisionRequest() {
let start = DispatchTime.now()
let model = Resnet50()
let request = VNImageRequestHandler(cgImage: randomImageView.image!.cgImage!, options: [:])
do {
let m = try VNCoreMLModel(for: model.model)
let coreMLRequest = VNCoreMLRequest(model: m) { (request, error) in
guard let observation = request.results?.first as? VNClassificationObservation else { return }
let stop = DispatchTime.now()
let nanoTime = stop.uptimeNanoseconds - start.uptimeNanoseconds
let timeInterval = Double(nanoTime)
self.classificationLabel.text = "\(observation.identifier) (\(observation.confidence * 100)%) in \(timeInterval) seconds."
}
try request.perform([coreMLRequest])
} catch {
print(error)
}
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let mediaType = info[UIImagePickerControllerMediaType] as! NSString
self.dismiss(animated: true, completion: nil)
if mediaType.isEqual(to: kUTTypeImage as String) {
let image = info[UIImagePickerControllerOriginalImage]
as! UIImage
randomImageView.image = image
if (newMedia == true) {
UIImageWriteToSavedPhotosAlbum(image, self,
#selector(ViewController.image(image:didFinishSavingWithError:contextInfo:)), nil)
} else if mediaType.isEqual(to: kUTTypeMovie as String) {
//Code to support video here
        }
}
}
@objc func image(image: UIImage, didFinishSavingWithError error: NSErrorPointer, contextInfo:UnsafeRawPointer) {
if error != nil {
let alert = UIAlertController(title: "Save Failed",
message: "Failed to save image",
preferredStyle: UIAlertControllerStyle.alert)
let cancelAction = UIAlertAction(title: "OK",
style: .cancel, handler: nil)
alert.addAction(cancelAction)
self.present(alert, animated: true,
completion: nil)
}
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
self.dismiss(animated: true, completion: nil)
}
}

Aucune idée pourquoi j'obtiens l'erreur ci-dessus en gras? Merci beaucoup d'avance pour votre temps.

OriginalL'auteur Alexander Athanasiadis | 2017-06-13