iOS10のカメラとライブラリの許可をリクエストする-Info.plist


84

アプリにWKWebViewを実装しました。表示されているWebページには、写真から画像をインポートする必要のあるファイル入力があります。その入力を押して[写真を撮る]または[フォトライブラリ]を選択すると、アプリが突然クラッシュします。これは、アプリに写真を撮るか、ライブラリからインポートする権限がないためだと思います。

ユーザーが上記の方法(写真を撮るまたは写真ライブラリ)のいずれかを選択したときに許可リクエストをプッシュするにはどうすればよいですか?

私はWKWebViewでSwift3.0を使用しています。


1
@KiritModiこんにちは、どうもありがとう。受け入れられるように、回答として投稿していただけませんか。
アラムリ2016

1
OKY ..私はウィル...
Kiritモディ

参考:UIImagePickerControllerドキュメントはこのiOS10 +要件に対して更新されませんでした(従来のObjective-Cドキュメントを含むすべてのページをスキミングしました)
benc 2017年

回答:


104

以下の権限をInfo.plistに追加する必要があります。より多くの参照

カメラ:

Key       :  Privacy - Camera Usage Description   
Value     :  $(PRODUCT_NAME) camera use

写真 :

Key       :  Privacy - Photo Library Usage Description    
Value     :  $(PRODUCT_NAME) photo use

私はまだIOS、特にそのネイティブ言語であるObjective-cとSwiftに不慣れです。これは私の日を救った..
どうも

こんにちは、私は実際にiPhone7ユーザーがフォトライブラリの許可を設定するのに問題があります。iPhone7ユーザーが自分の携帯電話で私のアプリ設定に移動すると、フォトライブラリオプションが表示されません。上記のKey:Valueがinfo.plistにあります。奇妙な部分は、iPhone7ユーザーを除いて、iOS10を実行しているすべてのデバイスがこのオプションを表示できることです。たとえば、iOS 10を実行しているiPhone6は、このオプションを表示できます。私は何か他のものが欠けていますか?
DevKyle 2016年

1
PRODUCT_NAMEはすでにAppleメッセージに含まれているため、これらの値に含めるべきではありません。例:「アプリ名」があなたの写真にアクセスしたい
ハリス

122

プログラムでアクセスをリクエストすることもできます。これは、ほとんどの場合、アクセスしたかどうかを知る必要があるためです。

Swift 4のアップデート:

    //Camera
    AVCaptureDevice.requestAccess(for: AVMediaType.video) { response in
        if response {
            //access granted
        } else {

        }
    }

    //Photos
    let photos = PHPhotoLibrary.authorizationStatus()
    if photos == .notDetermined {
        PHPhotoLibrary.requestAuthorization({status in
            if status == .authorized{
                ...
            } else {}
        })
    }

あなたはコードを共有していないので、これがあなたにとって役立つかどうかはわかりませんが、一般的に言えば、ベストプラクティスとして使用してください。


4
おかげで、この答えは私のために働いた!Swift 4を使用している場合は、最初の行を「AVCaptureDevice.requestAccess(for:AVMediaType.video){responsein」に変更する必要があります。
ケビン

1
この答えをありがとう。それは完璧に動作します。しかし、私はそれについて一つ疑問に思っていました。requestAuthorizationを実行すると、コードを実行する前にアクセス許可が設定されるまで待機する、ある種のリスナーが作成されますか?最初は、そのコードの実行はPHPhotoLibrary.authorizationStatusで停止しただけですが、一連のprintステートメントをドロップした後、それは継続しているように見えますか?
ジョージケンドロス2017年

4
スウィフト3AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { response in。することを忘れないでくださいimport AVFoundation
iurii 2017

2
答えてくれてありがとう。それがないと、アプリが許可なくフォトライブラリにアクセスできたため、アプリが拒否されました。
マケレレ2017

41

ファイル:Info.plist

カメラ

<key>NSCameraUsageDescription</key>
<string>camera description.</string>

写真

<key>NSPhotoLibraryUsageDescription</key>
<string> photos description.</string>

写真を保存

  <key>NSPhotoLibraryAddUsageDescription</key>
  <string> photos add description.</string>

ロケーション

<key> NSLocationWhenInUseUsageDescription</key>
<string> location description.</string>

Apple Music:

<key>NSAppleMusicUsageDescription</key>
<string>My description about why I need this capability</string>

カレンダー

<key>NSCalendarsUsageDescription</key>
<string>My description about why I need this capability</string>

Siri

<key>NSSiriUsageDescription</key>
<string>My description about why I need this capability</string>

27

上記のplist設定と適切なアクセサー(AVCaptureDeviceまたはPHPhotoLibrary)を使用しますが、本当に必要な場合は、次のように警告して設定に送信します。

Swift4.0および4.1

func proceedWithCameraAccess(identifier: String){
    // handler in .requestAccess is needed to process user's answer to our request
    AVCaptureDevice.requestAccess(for: .video) { success in
      if success { // if request is granted (success is true)
        DispatchQueue.main.async {
          self.performSegue(withIdentifier: identifier, sender: nil)
        }
      } else { // if request is denied (success is false)
        // Create Alert
        let alert = UIAlertController(title: "Camera", message: "Camera access is absolutely necessary to use this app", preferredStyle: .alert)

        // Add "OK" Button to alert, pressing it will bring you to the settings app
        alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
          UIApplication.shared.open(URL(string: UIApplicationOpenSettingsURLString)!)
        }))
        // Show the alert with animation
        self.present(alert, animated: true)
      }
    }
  }

20

ファイル:Info.plist

以下のためのカメラ

<key>NSCameraUsageDescription</key>
<string>You can take photos to document your job.</string>

以下のためにフォトライブラリ、あなたはこの1つはアプリのユーザーは写真のライブラリをブラウズできるようになるでしょう。

<key>NSPhotoLibraryUsageDescription</key>
<string>You can select photos to attach to reports.</string>

14

Swift 5 プログラムで追加することなくアクセス許可を追加する最も簡単な方法は、info.plistファイルを開き、[情報プロパティ]リストの横にある[+]を選択することです。ドロップダウンリストをスクロールして[プライバシー]オプションを表示し、カメラにアクセスするには[プライバシーカメラの使用法の説明]を選択し、フォトライブラリにアクセスするには[プライバシーフォトライブラリの使用法の説明]を選択します。選択を行った後、右側の文字列値を入力して、アラートポップアップがアクセス許可を要求したときにユーザーに表示するテキストを含めます。カメラ/写真ライブラリの許可


11

写真アプリの許可を求めるには、このコードを追加する必要があります(Swift 3)

PHPhotoLibrary.requestAuthorization({ 
       (newStatus) in 
         if newStatus ==  PHAuthorizationStatus.authorized { 
          /* do stuff here */ 
    } 
})

<key>NSPhotoLibraryUsageDescription</key> <string>You can select photos to attach to reports.</string>info.plistを追加することを忘れないでください
marcomoreira92 2017

スタンジ、私は何の問題もありません。このコードをボタンに追加し、iOS 10.3.1でiPhoneを使用してテストしましたが、
正常

3

考えられるすべてのケースを考慮した拡張機能を作成しました。

  • アクセスが許可されている場合、コードonAccessHasBeenGrantedが実行されます。
  • アクセスが決定されていない場合は、requestAuthorization(_:)が呼び出されます。
  • ユーザーがアプリのフォトライブラリへのアクセスを拒否した場合、設定に移動してアクセスを許可することを提案するウィンドウがユーザーに表示されます。このウィンドウでは、「キャンセル」ボタンと「設定」ボタンを使用できます。彼が「設定」ボタンを押すと、アプリケーションの設定が開きます。

使用例:

PHPhotoLibrary.execute(controller: self, onAccessHasBeenGranted: {
    // access granted... 
})

拡張コード:

import Photos
import UIKit

public extension PHPhotoLibrary {

   static func execute(controller: UIViewController,
                       onAccessHasBeenGranted: @escaping () -> Void,
                       onAccessHasBeenDenied: (() -> Void)? = nil) {

      let onDeniedOrRestricted = onAccessHasBeenDenied ?? {
         let alert = UIAlertController(
            title: "We were unable to load your album groups. Sorry!",
            message: "You can enable access in Privacy Settings",
            preferredStyle: .alert)
         alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
         alert.addAction(UIAlertAction(title: "Settings", style: .default, handler: { _ in
            if let settingsURL = URL(string: UIApplication.openSettingsURLString) {
               UIApplication.shared.open(settingsURL)
            }
         }))
         controller.present(alert, animated: true)
      }

      let status = PHPhotoLibrary.authorizationStatus()
      switch status {
      case .notDetermined:
         onNotDetermined(onDeniedOrRestricted, onAccessHasBeenGranted)
      case .denied, .restricted:
         onDeniedOrRestricted()
      case .authorized:
         onAccessHasBeenGranted()
      @unknown default:
         fatalError("PHPhotoLibrary::execute - \"Unknown case\"")
      }
   }

}

private func onNotDetermined(_ onDeniedOrRestricted: @escaping (()->Void), _ onAuthorized: @escaping (()->Void)) {
   PHPhotoLibrary.requestAuthorization({ status in
      switch status {
      case .notDetermined:
         onNotDetermined(onDeniedOrRestricted, onAuthorized)
      case .denied, .restricted:
         onDeniedOrRestricted()
      case .authorized:
         onAuthorized()
      @unknown default:
         fatalError("PHPhotoLibrary::execute - \"Unknown case\"")
      }
   })
}

0

Swift 5iOS13でカメラセッションを実装するための優れた方法

https://github.com/egzonpllana/CameraSession

Camera Sessionは、AVCaptureSessionを実装するための最も簡単な方法を作成しようとするiOSアプリです。

アプリを通じて、これらのカメラセッションが実装されていることがわかります。

  • 写真を撮ったり、ビデオを録画したりするためのネイティブカメラ。
  • 写真やビデオをインポートするネイティブな方法。
  • 写真やビデオなどのアセットを選択するカスタム方法。ライブラリから1つ以上のアセットを選択するオプションがあります。
  • 写真またはビデオを撮影するためのカスタムカメラ。ボタンを押したままにして録画するオプションがあります。
  • 個別のカメラ許可リクエスト。

トーチ回転カメラオプションなどのカスタムカメラ機能。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.