2017-06-13 10 views
12

だから私の問題です。私はUIImageViewとUIButtonがある画面を作成しようとしています。ユーザーがボタンを押すと、カメラアプリが開き、写真を撮って、カメラアプリで「写真を使う」を押すと、あなたは私のアプリの画面に戻り、前に述べたUIImageViewに写真が置かれます。iOS 11の写真キャプチャの許可の問題

私は「使用フォト」ボタンを押すと、画像が正しく私のUIImageViewに配置されていることであるが、以下のエラーとその後、アプリがクラッシュし、これまで行われます

このアプリは、それので、クラッシュしました使用法の説明なしにプライバシーに敏感なデータにアクセスしようとしました。アプリのInfo.plistには、NSPhotoLibraryAddUsageDescriptionキーと、アプリがこのデータをどのように使用するかを説明する文字列値が含まれている必要があります。私はこれまで何をやったか

は次のとおりです。

  1. はキー「プライバシーを - フォトライブラリの使い方の説明を」置き値「$は(PRODUCT_NAME)の写真を処理するために、ライブラリを使用します捕らえられた。 Info.plistファイル(Sourceフォームでどのように記述されているかチェックし、Apple Developer Documentationによれば正しい)

  2. Info.plistファイルの値「$(PRODUCT_NAME)はカメラを使用しています」を使用して、「Privacy - Camera Usage Description」キーを配置しました。 "ターゲット - >カスタム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) 
} 
} 

任意のアイデアを、私は太字で上記のエラーを取得する理由は?あなたの時間のために非常に前もってありがとう。あなたが他のプライバシーの権限のために行ったように、使用法の説明(文字列)とのInfo.plistに -

答えて

35

NSPhotoLibraryAddUsageDescriptionは

は、「フォトライブラリの追加使用法説明プライバシー」を追加してくださいiOSの11で追加されました。

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

+0

ありがとうございました!これが答えでした。今それは完璧に動作します! –

+0

これを追加しましたが、それでも私にとってはクラッシュします。私はバージョン9.0のベータ版を使用しています。 –

+0

@RubenZilibowitzおそらくplistキーを間違って入力したと思います。または、「NSPhotoLibraryAddUsageDescription」と入力すると、自動的に「Privacy - Photo Library Additions Usage Description」に変わります。 –

関連する問題