it-swarm.com.de

Probleme mit der Fotoerfassungsberechtigung in iOS 11

Also hier ist mein Problem. Ich versuche einen Bildschirm zu erstellen, in dem sich ein UIImageView und ein UIButton befinden. Wenn der Benutzer die Taste drückt, wird die Kamera-App geöffnet, Sie machen ein Foto, und wenn Sie in der Kamera-App auf "Foto verwenden" klicken, kehren Sie zum Bildschirm meiner App zurück, und das Foto wird in der zuvor erwähnten UIImageView platziert.

Was bisher passiert ist, dass wenn ich auf die Schaltfläche "Foto verwenden" drücke, das Bild korrekt in meiner UIImageView platziert wird, die App dann jedoch mit dem folgenden Fehler abstürzt:

Diese App ist abgestürzt, weil versucht wurde, auf datenschutzrelevante Daten ohne Verwendungsbeschreibung zuzugreifen. Die Info.plist der App muss einen NSPhotoLibraryAddUsageDescription-Schlüssel mit einem Zeichenfolgenwert enthalten, der dem Benutzer erklärt, wie Die App verwendet diese Daten.

Was ich bisher gemacht habe ist:

  1. Platziert den Schlüssel "Datenschutz - Verwendungsbeschreibung der Fotobibliothek" mit dem Wert "$ (PRODUCT_NAME) verwendet Bibliothek, um die von Ihnen aufgenommenen Fotos zu verarbeiten." in der Info.plist-Datei (auch überprüft, wie es in Quellform geschrieben ist und wie es gemäß der Apple Developer Documentation) korrekt ist).

  2. Platzieren Sie außerdem den Schlüssel "Datenschutz - Beschreibung der Kamerabenutzung" mit dem Wert "$ (PRODUCT_NAME) used Cameras" in der Datei Info.plist.

  3. Überprüft unter "ZIELE -> -> Info-> Benutzerdefinierte iOS-Zieleigenschaften" und die 2 Schlüssel/Wert-Paare, die ich in den Schritten 1 und 2 erwähnt habe, existieren.

Ich werde Ihnen meinen Code soweit zur Verfügung stellen:

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

Irgendeine Idee, warum ich den oben genannten Fehler in Fettdruck bekomme? Vielen Dank im Voraus für Ihre Zeit.

NSPhotoLibraryAddUsageDescription wurde in iOS 11 hinzugefügt.

Bitte fügen Sie in info.plist "Privacy - Photo Library Additions Usage Description" mit einer Verwendungsbeschreibung (String) hinzu, wie Sie es für die anderen Privilegien getan haben.

Ref: https://developer.Apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html

46
Kurt J