Poproś o pozwolenie na aparat i bibliotekę w iOS 10 - Info.plist

84

Zaimplementowałem WKWebView w aplikacji. na pokazanej stronie internetowej znajduje się plik wejściowy, do którego należy zaimportować obraz ze zdjęć. Za każdym razem, gdy naciskam to wejście i wybieram „Zrób zdjęcie” lub „Biblioteka zdjęć”, aplikacja nagle się zawiesza, co moim zdaniem jest spowodowane brakiem uprawnień do zrobienia zdjęcia lub importu z biblioteki.

Jak wysłać prośbę o pozwolenie, gdy użytkownik wybierze jedną z wymienionych metod (Zrób zdjęcie lub Biblioteka zdjęć)?

Używam Swift 3.0 z WKWebView.

Alamri
źródło
1
@KiritModi Cześć, wielkie dzięki. Czy możesz wysłać to jako odpowiedź, abym mógł to zaakceptować.
Alamri,
1
Oky… ja…
Kirit Modi,
Do Twojej wiadomości: Dokumentacja UIImagePickerController nigdy nie została zaktualizowana dla tego wymagania iOS10 + (przejrzałem każdą stronę, w tym
starszą

Odpowiedzi:

104

Musisz dodać poniższe uprawnienia w Info.plist. Więcej informacji

Aparat fotograficzny :

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

Zdjęcie:

Key       :  Privacy - Photo Library Usage Description    
Value     :  $(PRODUCT_NAME) photo use
Kirit Modi
źródło
Wciąż jestem nowy w IOS, zwłaszcza w jego językach ojczystych, Objective-c i Swift. To uratowało mi dzień ..
Wielkie
Cześć, mam problem ze skłonieniem użytkowników iPhone'a7 do ustawienia uprawnień do biblioteki zdjęć. Gdy użytkownicy iPhone7 przechodzą do ustawień mojej aplikacji na swoim telefonie, brakuje opcji biblioteki zdjęć. Mam klucz: wartość wymieniony powyżej w mojej info.plist. Dziwne jest to, że wszystkie urządzenia z systemem iOS 10 są w stanie zobaczyć tę opcję, z wyjątkiem użytkowników iPhone7. Na przykład iPhone6 ​​z systemem iOS 10 może zobaczyć tę opcję. Czy brakuje mi czegoś innego?
DevKyle,
1
Nie powinieneś uwzględniać PRODUCT_NAME w tych wartościach, ponieważ jest to już zawarte w wiadomości Apple. np. „Nazwa aplikacji” chce uzyskać dostęp do Twoich zdjęć
Harris
122

Możesz również poprosić o dostęp programowo, co wolę, ponieważ w większości przypadków musisz wiedzieć, czy wziąłeś dostęp, czy nie.

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

Nie udostępniasz kodu, więc nie jestem pewien, czy będzie to przydatne dla Ciebie, ale ogólnie używaj go jako najlepszej praktyki.

George Vardikos
źródło
4
Dzięki, ta odpowiedź zadziałała dla mnie! Dla osób używających Swift 4 pierwszą linię należy zmienić na: "AVCaptureDevice.requestAccess (dla: AVMediaType.video) {response in".
Kevin
1
Dzięki za tę odpowiedź. Działa doskonale. Zastanawiałem się jednak nad jedną rzeczą. Czy po uruchomieniu requestAuthorization tworzy pewnego rodzaju nasłuchiwanie, które czeka, aż uprawnienie zostanie ustawione przed uruchomieniem kodu? Na początku myślałem, że wykonanie kodu po prostu zatrzymało się na PHPhotoLibrary.authorizationStatus, ale po upuszczeniu kilku instrukcji print wydaje się, że nadal trwa?
George Kendros
4
Swift 3 : AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { response in. Nie zapomnij import AVFoundation.
iurii
2
Dziękuję za odpowiedź. Bez tego moja aplikacja została odrzucona, ponieważ mogłaby uzyskać dostęp do biblioteki zdjęć bez pozwolenia.
Makalele
41

Plik: Info.plist

Aparat fotograficzny

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

Zdjęcia

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

Zapisz zdjęcia

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

Lokalizacja

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

Apple Music:

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

Kalendarz

<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>
Vishal Vaghasiya
źródło
27

Użyj wyżej wymienionych ustawień plist i odpowiedniego akcesorium (AVCaptureDevice lub PHPhotoLibrary), ale także powiadom ich i wyślij do ustawień, jeśli naprawdę tego potrzebujesz, na przykład:

Swift 4.0 i 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)
      }
    }
  }
Joel Teply
źródło
20

Plik: Info.plist

Do aparatu :

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

W przypadku biblioteki zdjęć chcesz, aby ta aplikacja umożliwiała przeglądanie biblioteki zdjęć.

<key>NSPhotoLibraryUsageDescription</key>
<string>You can select photos to attach to reports.</string>
Ed of the Mountain
źródło
14

Swift 5 Najłatwiejszym sposobem dodania uprawnień bez konieczności wykonywania tego programowo jest otwarcie pliku info.plist i wybranie znaku + obok listy Właściwości informacji. Przewiń listę rozwijaną do opcji Prywatność i wybierz Opis użycia kamery prywatności, aby uzyskać dostęp do kamery, lub Opis użycia biblioteki zdjęć prywatności, aby uzyskać dostęp do biblioteki zdjęć. Wypełnij wartość String po prawej stronie po dokonaniu wyboru, aby dołączyć tekst, który chciałbyś wyświetlić użytkownikowi, gdy pojawi się komunikat z prośbą o pozwolenie.Pozwolenie na aparat / bibliotekę zdjęć

elarcoiris
źródło
11

Aby poprosić o pozwolenie na aplikację do zdjęć, musisz dodać ten kod (Swift 3) :

PHPhotoLibrary.requestAuthorization({ 
       (newStatus) in 
         if newStatus ==  PHAuthorizationStatus.authorized { 
          /* do stuff here */ 
    } 
})
marcomoreira92
źródło
nie zapomnij dodać <key>NSPhotoLibraryUsageDescription</key> <string>You can select photos to attach to reports.</string>do info.plist
marcomoreira92
dziwne, nie mam żadnych problemów. dodałem ten kod w przycisku i używam mojego iPhone'a z iOS 10.3.1 do testowania i działa dobrze
marcomoreira92
3

Napisałem rozszerzenie uwzględniające wszystkie możliwe przypadki:

  • Jeśli dostęp jest dozwolony, kod onAccessHasBeenGrantedzostanie uruchomiony.
  • Jeśli dostęp nie zostanie określony, requestAuthorization(_:)zostanie wywołany.
  • Jeśli użytkownik odmówił dostępu do biblioteki zdjęć aplikacji, zostanie mu wyświetlone okno umożliwiające przejście do ustawień i zezwolenie na dostęp. W tym oknie będą dostępne dla niego przyciski „Anuluj” i „Ustawienia”. Kiedy naciśnie przycisk „Ustawienia”, otworzą się ustawienia aplikacji.

Przykład użycia:

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

Kod rozszerzenia:

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\"")
      }
   })
}
dronpop
źródło
0

Świetny sposób na implementację sesji aparatu w Swift 5 , iOS 13

https://github.com/egzonpllana/CameraSession

Camera Session to aplikacja na iOS, która stara się jak najprostszy sposób implementacji AVCaptureSession.

W aplikacji można znaleźć zaimplementowane następujące sesje kamery:

  • Natywny aparat do robienia zdjęć lub nagrywania wideo.
  • Natywny sposób importowania zdjęć i filmów.
  • Niestandardowy sposób wybierania zasobów, takich jak zdjęcia i filmy, z opcją wyboru jednego lub więcej zasobów z Biblioteki.
  • Niestandardowy aparat do robienia zdjęć lub filmów, z opcjami przytrzymania przycisku i nagrywania.
  • Oddzielne prośby o pozwolenie na aparat.

Niestandardowe funkcje aparatu obejmują opcje latarki i obracania aparatu .

Doci
źródło