Richiedi l'autorizzazione per fotocamera e libreria in iOS 10 - Info.plist


89

Ho implementato un WKWebView in un'app. c'è un file di input nella pagina web mostrata dove dovrebbe importare un'immagine dalle foto. Ogni volta che premo su quell'ingresso e seleziono "Scatta foto" o "Libreria foto", l'app si blocca improvvisamente, il che credo sia dovuto al fatto che all'app manca l'autorizzazione per scattare una foto o importare dalla libreria.

Come faccio a inviare una richiesta di autorizzazione quando l'utente seleziona uno dei metodi menzionati (Scatta foto o Libreria di foto)?

Uso Swift 3.0 con WKWebView.


1
@KiritModi Ciao, grazie mille. Puoi per favore pubblicarlo come risposta in modo che io possa accettarlo.
Alamri

1
Oky .. io ...
Kirit Modi

FYI: i documenti di UIImagePickerController non sono mai stati aggiornati per questo requisito iOS10 + (ho passato in rassegna ogni pagina, inclusi i documenti Objective-C legacy)
benc

Risposte:


106

Devi aggiungere l'autorizzazione di seguito in Info.plist. Più riferimento

Telecamera :

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

Foto:

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

Sono ancora nuovo su IOS, specialmente le sue lingue native, Objective-c e Swift. Questo mi ha salvato la giornata .. Grazie
mille

Ciao, in realtà ho problemi a convincere gli utenti di iPhone7 a impostare i permessi per la libreria di foto. Quando gli utenti di iPhone7 accedono alle impostazioni della mia app sul proprio telefono, manca l'opzione della libreria di foto. Ho la chiave: valore menzionato sopra nel mio info.plist. La parte strana è che tutti i dispositivi con iOS 10 sono in grado di vedere questa opzione, ad eccezione degli utenti di iPhone7. Ad esempio, iPhone6 ​​con iOS 10 può vedere questa opzione. Mi manca qualcos'altro?
DevKyle

1
Non dovresti includere PRODUCT_NAME in questi valori, poiché è già incluso nel messaggio Apple. ad esempio "Nome app" vorrebbe accedere alle tue foto
Harris

124

Puoi anche richiedere l'accesso in modo programmatico, cosa che preferisco perché nella maggior parte dei casi devi sapere se hai preso l'accesso o meno.

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

Non condividi il codice, quindi non posso essere sicuro che possa esserti utile, ma in generale lo usi come best practice.


5
Grazie, questa risposta ha funzionato per me! Per le persone che utilizzano Swift 4 la prima riga dovrebbe essere cambiata in: "AVCaptureDevice.requestAccess (for: AVMediaType.video) {response in".
Kevin

1
Grazie per questa risposta. Funziona perfettamente. Ma mi chiedevo una cosa al riguardo. Quando esegui requestAuthorization, crea una sorta di listener che attende fino a quando non viene impostata l'autorizzazione prima di eseguire il suo codice? All'inizio pensavo che l'esecuzione del codice si fermasse semplicemente a PHPhotoLibrary.authorizationStatus, ma dopo aver rilasciato un mucchio di istruzioni di stampa sembra che continui?
George Kendros

4
Swift 3 : AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { response in. Non dimenticare di farlo import AVFoundation.
iurii

2
Grazie per la risposta. Senza di essa la mia app è stata rifiutata, perché l'app potrebbe accedere alla libreria di foto senza autorizzazione.
Makalele

44

Info.plist

Foto limitate

<key>PHPhotoLibraryPreventAutomaticLimitedAccessAlert</key>
<true/>

telecamera

<key>NSCameraUsageDescription</key>
<string>$(PRODUCT_NAME) camera description.</string>

Fotografie

<key>NSPhotoLibraryUsageDescription</key>
<string>$(PRODUCT_NAME)photos description.</string>

Salva foto

<key>NSPhotoLibraryAddUsageDescription</key>
<string>$(PRODUCT_NAME) photos add description.</string>

Posizione

<key> NSLocationWhenInUseUsageDescription</key>
<string>$(PRODUCT_NAME) location description.</string>

Apple Music

<key>NSAppleMusicUsageDescription</key>
<string>$(PRODUCT_NAME) My description about why I need this capability</string>

Calendario

<key>NSCalendarsUsageDescription</key>
<string>$(PRODUCT_NAME) My description about why I need this capability</string>

Siri

<key>NSSiriUsageDescription</key>
<string>$(PRODUCT_NAME) My description about why I need this capability</string>

28

Usa le impostazioni plist sopra menzionate e l'accessor appropriato (AVCaptureDevice o PHPhotoLibrary), ma avvisali anche e inviali alle impostazioni se ne hai davvero bisogno, in questo modo:

Swift 4.0 e 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)
      }
    }
  }

21

File: Info.plist

Per la fotocamera :

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

Per Photo Library , vorrai che questo consenta all'utente dell'app di sfogliare la libreria di foto.

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

15

Swift 5 Il modo più semplice per aggiungere autorizzazioni senza doverlo fare in modo programmatico è aprire il file info.plist e selezionare il + accanto all'elenco Proprietà informazioni. Scorri l'elenco a discesa fino alle opzioni Privacy e seleziona Descrizione utilizzo telecamera privacy per accedere alla fotocamera o Descrizione utilizzo libreria foto privacy per accedere alla libreria foto. Compila il valore Stringa a destra dopo aver effettuato la selezione, per includere il testo che desideri visualizzare all'utente quando il popup di avviso richiede le autorizzazioni.Autorizzazione per fotocamera / libreria di foto


11

Per chiedere l'autorizzazione per l'app foto è necessario aggiungere questo codice (Swift 3) :

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

non dimenticare di aggiungere <key>NSPhotoLibraryUsageDescription</key> <string>You can select photos to attach to reports.</string>info.plist
marcomoreira92

stange, non ho problemi. Ho aggiunto questo codice in un pulsante e sto usando il mio iPhone con iOS 10.3.1 per testarlo e funziona bene
marcomoreira92

5

Ho scritto un'estensione che tiene conto di tutti i casi possibili:

  • Se l'accesso è consentito, il codice onAccessHasBeenGrantedverrà eseguito.
  • Se l'accesso non è determinato, requestAuthorization(_:)verrà chiamato.
  • Se l'utente ha negato l'accesso alla libreria di foto dell'app, verrà visualizzata una finestra che offre di accedere alle impostazioni e consentire l'accesso. In questa finestra gli saranno disponibili i pulsanti "Annulla" e "Impostazioni". Quando preme il pulsante "Impostazioni", si apriranno le impostazioni dell'applicazione.

Esempio di utilizzo:

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

Codice estensione:

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

Ottimo modo per implementare la sessione della fotocamera in Swift 5 , iOS 13

https://github.com/egzonpllana/CameraSession

Camera Session è un'app iOS che cerca di rendere il modo più semplice possibile di implementazione di AVCaptureSession.

Tramite l'app puoi trovare queste sessioni di telecamera implementate:

  • Fotocamera nativa per scattare una foto o registrare un video.
  • Modo nativo per importare foto e video.
  • Il modo personalizzato per selezionare risorse come foto e video, con un'opzione per selezionare una o più risorse dalla libreria.
  • Fotocamera personalizzata per scattare foto o video, con opzioni per tenere premuto il pulsante e registrare.
  • Richieste di autorizzazione per fotocamera separata.

Le caratteristiche della fotocamera personalizzata come torcia e opzioni di rotazione della fotocamera .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.