在 iOS 10 - Info.plist 中请求相机和图书馆的许可
Request Permission for Camera and Library in iOS 10 - Info.plist
我在应用程序中实现了 WKWebView。
在显示的网页中有一个文件输入,它应该从照片中导入图像。
每当我按下该输入并 select "Take Photo" 或 "Photo Library" 时,应用程序突然崩溃,我认为这是因为该应用程序缺少拍照或从库导入的权限。
当用户 select 提到的方法之一(拍照或照片库)时,如何推送权限请求?
我使用 Swift 3.0 和 WKWebView。
You have to add the below permission in Info.plist. More Referance
相机:
Key : Privacy - Camera Usage Description
Value : $(PRODUCT_NAME) camera use
照片:
Key : Privacy - Photo Library Usage Description
Value : $(PRODUCT_NAME) photo use
文件:Info.plist
对于相机:
<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 {}
})
}
您不共享代码,因此我无法确定这是否对您有用,但一般来说,将其作为最佳实践使用。
要请求照片应用程序的权限,您需要添加此代码 (Swift 3):
PHPhotoLibrary.requestAuthorization({
(newStatus) in
if newStatus == PHAuthorizationStatus.authorized {
/* do stuff here */
}
})
Swift 5
无需以编程方式添加权限的最简单方法是打开 info.plist 文件和 select Information 属性 列表旁边的 +。滚动下拉列表至隐私选项和 select 隐私相机使用说明以访问相机,或隐私照片库使用说明以访问照片库。在您创建 selection 后,在右侧填写字符串值,以包含您希望在弹出警报请求权限时向用户显示的文本。
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 5、iOS 13
中实现相机会话的好方法
https://github.com/egzonpllana/CameraSession
Camera Session 是一个 iOS 应用程序,它试图以最简单的方式实现 AVCaptureSession。
通过该应用程序,您可以找到实现的这些相机会话:
- 用于拍照或录制视频的原生相机。
- 导入照片和视频的原生方式。
- select 资产(如照片和视频)的自定义方式,可选择从库中select 一项或多项资产。
- 用于拍摄照片或视频的自定义相机,可选择按住按钮并进行录制。
- 分离相机权限请求。
自定义相机功能,例如 手电筒 和 旋转相机 选项。
我写了一个扩展,考虑了所有可能的情况:
- 如果允许访问,则代码
onAccessHasBeenGranted
将为 运行。
- 如果访问未确定,则调用
requestAuthorization(_:)
。
- 如果用户拒绝了您的应用照片库访问权限,则会向用户显示 window 提议转到设置并允许访问。在此 window 中,他可以使用“取消”和“设置”按钮。当他按下“设置”按钮时,您的应用程序设置将打开。
用法示例:
PHPhotoLibrary.execute(controller: self, onAccessHasBeenGranted: {
// access granted...
})
分机号:[=14=]
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\"")
}
})
}
我在应用程序中实现了 WKWebView。 在显示的网页中有一个文件输入,它应该从照片中导入图像。 每当我按下该输入并 select "Take Photo" 或 "Photo Library" 时,应用程序突然崩溃,我认为这是因为该应用程序缺少拍照或从库导入的权限。
当用户 select 提到的方法之一(拍照或照片库)时,如何推送权限请求?
我使用 Swift 3.0 和 WKWebView。
You have to add the below permission in Info.plist. More Referance
相机:
Key : Privacy - Camera Usage Description
Value : $(PRODUCT_NAME) camera use
照片:
Key : Privacy - Photo Library Usage Description
Value : $(PRODUCT_NAME) photo use
文件:Info.plist
对于相机:
<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 {}
})
}
您不共享代码,因此我无法确定这是否对您有用,但一般来说,将其作为最佳实践使用。
要请求照片应用程序的权限,您需要添加此代码 (Swift 3):
PHPhotoLibrary.requestAuthorization({
(newStatus) in
if newStatus == PHAuthorizationStatus.authorized {
/* do stuff here */
}
})
Swift 5
无需以编程方式添加权限的最简单方法是打开 info.plist 文件和 select Information 属性 列表旁边的 +。滚动下拉列表至隐私选项和 select 隐私相机使用说明以访问相机,或隐私照片库使用说明以访问照片库。在您创建 selection 后,在右侧填写字符串值,以包含您希望在弹出警报请求权限时向用户显示的文本。
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 5、iOS 13
中实现相机会话的好方法https://github.com/egzonpllana/CameraSession
Camera Session 是一个 iOS 应用程序,它试图以最简单的方式实现 AVCaptureSession。
通过该应用程序,您可以找到实现的这些相机会话:
- 用于拍照或录制视频的原生相机。
- 导入照片和视频的原生方式。
- select 资产(如照片和视频)的自定义方式,可选择从库中select 一项或多项资产。
- 用于拍摄照片或视频的自定义相机,可选择按住按钮并进行录制。
- 分离相机权限请求。
自定义相机功能,例如 手电筒 和 旋转相机 选项。
我写了一个扩展,考虑了所有可能的情况:
- 如果允许访问,则代码
onAccessHasBeenGranted
将为 运行。 - 如果访问未确定,则调用
requestAuthorization(_:)
。 - 如果用户拒绝了您的应用照片库访问权限,则会向用户显示 window 提议转到设置并允许访问。在此 window 中,他可以使用“取消”和“设置”按钮。当他按下“设置”按钮时,您的应用程序设置将打开。
用法示例:
PHPhotoLibrary.execute(controller: self, onAccessHasBeenGranted: {
// access granted...
})
分机号:[=14=]
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\"")
}
})
}