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.