在 iOS10-Info.plist 中请求摄像头和图书馆的许可

我已经在一个应用程序中实现了 WKWebView。 在显示的网页中有一个文件输入,它应该从照片中导入一个图像。 每当我按下这个输入并选择“拍照”或“照片库”的应用程序突然崩溃,我相信这是因为应用程序失去了权限,无论是采取照片或从图书馆导入。

当用户选择上述方法之一(Take Photo 或 Photo Library)时,如何推送权限请求?

I use Swift 3.0 with WKWebView.

223144 次浏览

您必须在 Info.plist 中添加以下权限

相机:

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

Photo :

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

文件: Info.plist

For 相机:

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

对于 图片库,您将希望这个应用程序用户能够浏览照片库。

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

您还可以通过编程方式请求访问,我更喜欢这种方式,因为在大多数情况下,您需要知道是否接受了访问。

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

您不共享代码,所以我不能确定这是否对您有用,但一般来说,使用它作为一个最佳实践。

要获得照片应用程序的许可,你需要添加以下代码 (斯威夫特3):

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

Swift 5 添加权限的最简单方法是打开 info.plist 文件并选择 Information Property 列表旁边的 + 。在下拉列表中滚动到“隐私”选项,然后选择“隐私相机使用说明”用于访问相机,或者“隐私照片库使用说明”用于访问照片库。在您做出选择之后,在右边填充 String 值,以便在弹出的警报询问权限时包含您希望显示给用户的文本。Camera/Photo Library permission

Info.plist

有限的照片

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

相机

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

照片

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

保存照片

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

地点

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

苹果音乐

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

日历

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

使用上面提到的 plist 设置和适当的访问器(AVCaptureDevice 或 PHPhotoLibrary) ,但如果你真的需要,也可以提醒他们并将他们发送到设置中,如下所示:

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

Swift 5iOS 13中实现摄像机会话的一个很好的方法

Https://github.com/egzonpllana/camerasession

Camera Session 是一个 iOS 应用程序,它试图以最简单的方式实现 AVCaptureSession。

通过这个应用程序,你可以发现这些相机会话实现:

  • 用于拍摄照片或录制视频的本地相机。
  • 导入照片和视频的本地方式。
  • 自定义选择资产(如照片和视频)的方式,可以选择从 Library 中选择一个或多个资产。
  • 自定义相机采取照片(s)或视频(s) ,与选项按下按钮和记录。
  • 分开的摄像机许可申请。

定制的相机功能,如 torch旋转摄像机选项。

我写了一个扩展,考虑到了所有可能的情况:

  • 如果允许访问,则将运行代码 onAccessHasBeenGranted
  • 如果未确定访问权限,则将调用 requestAuthorization(_:)
  • 如果用户拒绝您的应用程序照片库访问,然后用户将显示一个窗口提供到设置和允许访问。在此窗口中,“取消”和“设置”按钮将可供他使用。当他按下“设置”按钮,您的应用程序设置将打开。

用法例子:

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

Extension code:

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)
}
}))
DispatchQueue.main.async {
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\"")
}
})
}

在你的项目的 info.plist中添加以下 keys以及 Request Permissions所需的 string消息:

图片 :

Privacy - Photo Library Additions Usage Description

Privacy - Photo Library Usage Description

相机 :

Privacy - Camera Usage Description

最好去苹果的技术文档学习所有 受保护的资源 (Bluetooth, Calendar, Camera & Microphone, Contacts Face ID , Location , Photos etc)的一切详细检查。

Https://developer.apple.com/documentation/technologies

登入以上连结及搜寻:

Property List Keys -> Bundle Resources -> Information Property List -> Protected resources

Quick Guide Video for implementation in your Project

谢谢! :)