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

Zaimplementowałem WKWebView w aplikacji. na wyświetlonej stronie internetowej znajduje się plik, do którego należy zaimportować obraz ze zdjęć. Za każdym razem, gdy naciskam na to wejście i wybierz "Zrób zdjęcie" lub "biblioteka zdjęć" aplikacja nagle się zawiesza, co moim zdaniem jest dlatego, że aplikacja nie ma uprawnień do robienia zdjęć lub importowania z biblioteki.

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

Używam Swift 3.0 z WKWebView.

Author: Kirit Modi, 2016-09-22

9 answers

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

Aparat:

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

Zdjęcie:

Key       :  Privacy - Photo Library Usage Description    
Value     :  $(PRODUCT_NAME) photo use
 106
Author: Kirit Modi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-24 03:09:34

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.

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

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

 128
Author: George Vardikos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-26 14:00:10

Info.plist

Ograniczone Zdjęcia

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

Aparat

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

Zdjęcia

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

Zapisz Zdjęcia

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

Lokalizacja

<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>

Kalendarz

<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>
 46
Author: Vishal Vaghasiya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-24 09:01:11

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

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)
      }
    }
  }
 28
Author: Joel Teply,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-24 19:24:24

Plik: Info.plist

Dla Kamery :

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

Dla Photo Library , będziesz chciał, aby ta umożliwiła użytkownikowi aplikacji przeglądanie biblioteki zdjęć.

<key>NSPhotoLibraryUsageDescription</key>
<string>You can select photos to attach to reports.</string>
 21
Author: Ed of the Mountain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-08 18:24:20

Swift 5 Najprostszym sposobem na dodanie uprawnień bez konieczności robienia tego programowo, jest otwarcie informacji.plik plist i wybierz + obok listy właściwości Information. Przewiń rozwijaną listę do opcji Prywatności i wybierz opis użycia kamery prywatności w celu uzyskania dostępu do kamery lub opis użycia biblioteki zdjęć prywatności w celu uzyskania dostępu do biblioteki zdjęć. Po dokonaniu wyboru wpisz wartość ciągu znaków po prawej stronie, aby dołączyć tekst, który chcesz wyświetlane użytkownikowi, gdy wyskakujące okienko alertu zapyta o uprawnienia. Pozwolenie na aparat fotograficzny/bibliotekę zdjęć

 15
Author: elarcoiris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-02 15:11:30

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 */ 
    } 
})
 11
Author: marcomoreira92,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-07 17:48:54

Napisałem rozszerzenie, które uwzględnia wszystkie możliwe przypadki:

  • Jeśli dostęp jest dozwolony, wtedy kod onAccessHasBeenGranted zostanie uruchomiony.
  • jeśli dostęp nie jest określony, to zostanie wywołany requestAuthorization(_:).
  • Jeśli użytkownik odmówił dostępu do biblioteki zdjęć aplikacji, zostanie wyświetlone okno oferujące przejście do ustawień i Zezwolenie na dostęp. W tym oknie dostępne będą dla niego przyciski "anuluj" i "ustawienia". Kiedy naciśnie przycisk "Ustawienia", Ustawienia aplikacji otworzę.

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\"")
      }
   })
}
 5
Author: dronpop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-04 11:26:13

Świetny sposób realizacji sesji kamery w Swift 5, iOS 13

Https://github.com/egzonpllana/CameraSession

Camera Session to aplikacja na iOS, która stara się zrobić najprostszy możliwy sposób implementacji Avcapturession.

Za pośrednictwem aplikacji można znaleźć te sesje kamery realizowane:

  • natywna kamera do robienia zdjęć lub nagrywania wideo.
  • natywny sposób importowania zdjęć i filmy.
  • 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 wideo, z opcjami przytrzymywania przycisku i nagrywania.
  • oddzielone żądania uprawnień kamery.

Aparat Niestandardowy oferuje opcje: torch i rotate camera .

 0
Author: Doci,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-06 08:52:12