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.
Odpowiedzi:
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
źródło
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.
źródło
AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { response in
. Nie zapomnijimport AVFoundation
.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>
źródło
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) } } }
źródło
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>
źródło
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.
źródło
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 */ } })
źródło
<key>NSPhotoLibraryUsageDescription</key> <string>You can select photos to attach to reports.</string>
do info.plistNapisałem rozszerzenie uwzględniające wszystkie możliwe przypadki:
onAccessHasBeenGranted
zostanie uruchomiony.requestAuthorization(_:)
zostanie wywołany.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\"") } }) }
źródło
Ś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:
Niestandardowe funkcje aparatu obejmują opcje latarki i obracania aparatu .
źródło