iOS 11中的照片捕获权限问题

所以这是我的问题。 我正在尝试创build一个UIImageView和UIButton的屏幕。 当用户按下button,相机应用程序打开,你拍照,如果你在相机应用程序中按“使用照片”,你将返回到我的应用程序的屏幕,照片被放置在我前面提到的UIImageView。

到目前为止发生的事情是,当我按下“使用照片”button时,图像被正确放置在我的UIImageView中,但是应用程序崩溃,出现以下错误:

这个应用程序已经崩溃,因为它试图访问隐私敏感的数据没有使用说明。 应用程序的Info.plist必须包含一个带有string值的NSPhotoLibraryAddUsageDescription项,向用户解释应用程序如何使用此数据。

我到目前为止所做的是:

  1. 将值为“$(PRODUCT_NAME)”的“隐私 – 图片库使用说明”键设置为使用库来处理您拍摄的照片。 在Info.plist文件中(也检查了它是如何用Sourceforms编写的,根据Apple开发者文档是正确的)。

  2. 在Info.plist文件中还放置了“隐私 – 相机使用说明”键值“$(PRODUCT_NAME)使用相机”。

  3. 在“目标 – > – >信息 – >自定义iOS目标属性”下选中,并在步骤1和步骤2中提到了2个键/值对。

到目前为止,我会向您提供我的代码:

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

任何想法,为什么我以粗体显示上述错误? 非常感谢您的时间。

iOS 11添加了NSPhotoLibraryAddUsageDescription。

请使用说明(string)在info.plist中添加“隐私 – 图片库添加使用说明”,就像您为其他隐私权限所做的一样。

参考: https : //developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html