Fordern Sie die Berechtigung für Kamera und Bibliothek in iOS 10 - Info.plist an


81

Ich habe ein WKWebView in einer App implementiert. Auf der angezeigten Webseite befindet sich eine Dateieingabe, über die ein Bild aus Fotos importiert werden soll. Immer wenn ich auf diese Eingabe drücke und entweder "Foto aufnehmen" oder "Fotobibliothek" auswähle, stürzt die App plötzlich ab, was meiner Meinung nach darauf zurückzuführen ist, dass der App die Berechtigung fehlt, entweder ein Foto aufzunehmen oder aus der Bibliothek zu importieren.

Wie kann ich eine Berechtigungsanforderung senden, wenn der Benutzer eine der genannten Methoden auswählt (Foto aufnehmen oder Fotobibliothek)?

Ich benutze Swift 3.0 mit WKWebView.


1
@KiritModi Hallo, vielen Dank. Kannst du es bitte als Antwort posten, damit ich es akzeptieren kann?
Alamri

1
Oky .. ich werde ...
Kirit Modi

Zu Ihrer Information: UIImagePickerController-Dokumente wurden nie für diese iOS10 + -Anforderung aktualisiert (ich habe jede Seite, einschließlich der älteren Objective-C-Dokumente,
überflogen

Antworten:


103

Sie müssen die folgende Berechtigung in Info.plist hinzufügen. Mehr Referenz

Kamera:

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

Foto:

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

Ich bin noch neu in IOS, insbesondere in den Muttersprachen Objective-c und Swift. Das hat mir den Tag gerettet. Vielen Dank
Alamri

Hallo, ich habe tatsächlich Probleme, iPhone7-Benutzer davon abzuhalten, die Berechtigung für die Fotobibliothek festzulegen. Wenn iPhone7-Benutzer auf ihrem Telefon zu meinen App-Einstellungen wechseln, fehlt die Option für die Fotobibliothek. Ich habe den oben genannten Schlüssel: Wert in meiner info.plist. Der seltsame Teil ist, dass alle Geräte mit iOS 10 diese Option sehen können, außer iPhone7-Benutzer. iPhone6 ​​mit iOS 10 kann diese Option beispielsweise sehen. Vermisse ich noch etwas
DevKyle

1
Sie sollten PRODUCT_NAME nicht in diese Werte aufnehmen, da dies bereits in der Apple-Nachricht enthalten ist. zB "App Name" möchte auf Ihre Fotos zugreifen
Harris

119

Sie können den Zugriff auch programmgesteuert anfordern, was ich bevorzuge, da Sie in den meisten Fällen wissen müssen, ob Sie den Zugriff erhalten haben oder nicht.

Swift 4 Update:

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

Sie teilen keinen Code, daher kann ich nicht sicher sein, ob dies für Sie nützlich wäre, aber im Allgemeinen wird er als Best Practice verwendet.


4
Danke, diese Antwort hat bei mir funktioniert! Für Benutzer von Swift 4 sollte die erste Zeile in "AVCaptureDevice.requestAccess (für: AVMediaType.video) {response in" geändert werden.
Kevin

1
Danke für diese Antwort. Es funktioniert perfekt. Ich habe mich allerdings etwas gefragt. Wenn Sie requestAuthorization ausführen, wird eine Art Listener erstellt, der wartet, bis die Berechtigung festgelegt ist, bevor der Code ausgeführt wird. Zuerst dachte ich, dass die Codeausführung einfach bei PHPhotoLibrary.authorizationStatus gestoppt wurde, aber nachdem ich eine Reihe von Druckanweisungen abgelegt habe, scheint es, als würde es weitergehen?
George Kendros

4
Swift 3 : AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { response in. Vergiss es nicht import AVFoundation.
iurii

1
Danke für die Antwort. Ohne sie wurde meine App abgelehnt, da die App ohne Erlaubnis auf die Fotobibliothek zugreifen konnte.
Makalele

40

Datei: Info.plist

Kamera

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

Fotos

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

Fotos speichern

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

Ort

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

Apple Music:

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

Kalender

<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

Verwenden Sie die oben genannten Plist-Einstellungen und den entsprechenden Accessor (AVCaptureDevice oder PHPhotoLibrary), benachrichtigen Sie sie jedoch auch und senden Sie sie an die Einstellungen, wenn Sie dies wirklich benötigen.

Swift 4.0 und 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

Datei: Info.plist

Für die Kamera :

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

Für die Fotobibliothek soll diese App dem App-Benutzer das Durchsuchen der Fotobibliothek ermöglichen.

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

13

Swift 5 Der einfachste Weg, Berechtigungen hinzuzufügen, ohne dies programmgesteuert ausführen zu müssen, besteht darin, die Datei info.plist zu öffnen und das + neben der Liste Informationseigenschaften auszuwählen. Scrollen Sie durch die Dropdown-Liste zu den Datenschutzoptionen und wählen Sie Nutzungsbeschreibung für die Datenschutzkamera für den Zugriff auf die Kamera oder Nutzungsbeschreibung für die Datenschutz-Fotobibliothek für den Zugriff auf die Fotobibliothek. Geben Sie den String-Wert rechts ein, nachdem Sie Ihre Auswahl getroffen haben, um den Text einzuschließen, der Ihrem Benutzer angezeigt werden soll, wenn in der Warnmeldung nach Berechtigungen gefragt wird.Erlaubnis für Kamera / Fotobibliothek


11

Um die Erlaubnis für die Foto-App zu erhalten, müssen Sie diesen Code hinzufügen (Swift 3) :

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

Vergessen Sie nicht, <key>NSPhotoLibraryUsageDescription</key> <string>You can select photos to attach to reports.</string>in der info.plist
marcomoreira92

seltsam, ich habe keine Probleme. Ich habe diesen Code in einer Schaltfläche hinzugefügt und ich benutze mein iPhone mit iOS 10.3.1 zum Testen und es funktioniert gut
marcomoreira92

1

Ich habe eine Erweiterung geschrieben, die alle möglichen Fälle berücksichtigt:

  • Wenn der Zugriff zulässig ist, wird der Code onAccessHasBeenGrantedausgeführt.
  • Wenn der Zugriff nicht festgelegt ist, requestAuthorization(_:)wird aufgerufen.
  • Wenn der Benutzer den Zugriff auf Ihre App-Fotobibliothek verweigert hat, wird dem Benutzer ein Fenster angezeigt, in dem er die Einstellungen aufrufen und den Zugriff zulassen kann. In diesem Fenster stehen ihm die Schaltflächen "Abbrechen" und "Einstellungen" zur Verfügung. Wenn er die Schaltfläche "Einstellungen" drückt, werden Ihre Anwendungseinstellungen geöffnet.

Anwendungsbeispiel:

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

Erweiterungscode:

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

Hervorragende Möglichkeit zur Implementierung einer Kamerasitzung in Swift 5 , iOS 13

https://github.com/egzonpllana/CameraSession

Camera Session ist eine iOS-App, die versucht, die Implementierung von AVCaptureSession so einfach wie möglich zu gestalten.

Über die App können Sie diese Kamerasitzung implementiert finden:

  • Native Kamera zum Aufnehmen oder Aufnehmen eines Videos.
  • Native Methode zum Importieren von Fotos und Videos.
  • Die benutzerdefinierte Methode zum Auswählen von Assets wie Fotos und Videos mit der Option zum Auswählen eines oder mehrerer Assets aus der Bibliothek.
  • Benutzerdefinierte Kamera zum Aufnehmen von Fotos oder Videos mit Optionen zum Gedrückthalten der Taste und Aufnehmen.
  • Separate Kamera-Berechtigungsanforderungen.

Die benutzerdefinierte Kamera bietet Funktionen wie Taschenlampe und Drehkamera .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.