在iOS 10中请求相机和库的权限-Info.plist


84

我已经在应用程序中实现了WKWebView。在显示的网页中有一个文件输入,它应该从照片中导入图像。每当我按该输入并选择“拍摄照片”或“照片图库”时,应用程序都会突然崩溃,我认为这是因为该应用程序缺少拍摄照片或从图库中导入的权限。

当用户选择上述方法之一(拍摄照片或照片库)时,如何发送许可请求?

我将Swift 3.0与WKWebView一起使用。


1
@KiritModi嗨,非常感谢。能否请您将其发布为答案,以便我接受。
Alamri

1
好吧..我会...
Kirit Modi

仅供参考:UIImagePickerController文档从未针对此iOS10 +要求进行过更新(我浏览了每个页面,包括旧的Objective-C文档)
benc

Answers:


104

您必须在Info.plist中添加以下权限。更多参考

摄影机

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

照片:

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

我对IOS还是很陌生,尤其是它的本地语言,Objective-c和Swift。这节省了我的时间。.非常感谢
Alamri

嗨,我实际上很难让iPhone7用户设置照片库权限。当iPhone7用户在手机上转到我的应用程序设置时,照片库选项丢失。我的info.plist中有上面提到的Key:Value。奇怪的是,除了iPhone7用户之外,所有运行iOS 10的设备都可以看到此选项。例如,运行iOS 10的iPhone6可以看到此选项。我还想念其他东西吗?
DevKyle

1
您不应该在这些值中包括PRODUCT_NAME,因为Apple消息中已经包含了PRODUCT_NAME。例如,“应用程序名称”将要访问您的照片
哈里斯

122

您还可以通过编程方式请求访问权限,我更喜欢这样做,因为在大多数情况下,您需要知道是否获得访问权限。

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

您不共享代码,所以我不确定这是否对您有用,但是一般而言,将其用作最佳实践。


4
谢谢,这个答案对我有用!对于使用Swift 4的用户,第一行应更改为:“ AVCaptureDevice.requestAccess(for:AVMediaType.video){response in”。
凯文

1
感谢您的回答。完美运作。我在想一件事。当您运行requestAuthorization时,它是否会创建某种侦听器,该侦听器会等到设置权限后再运行其代码?起初我虽然在PHPhotoLibrary.authorizationStatus处停止了代码执行,但是在周围放了一些打印语句后,它似乎还在继续?
乔治·肯德罗斯

4
斯威夫特3AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { response in。别忘了import AVFoundation
iurii

2
谢谢你的回答。没有它,我的应用程序将被拒绝,因为该应用程序可未经许可访问照片库。
Makalele '17

41

文件:Info.plist

相机

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

相片

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

保存照片

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

位置

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

苹果音乐:

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

日历

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

西里

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

27

使用上面提到的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)
      }
    }
  }

20

文件: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>

14

Swift 5 无需编程即可添加权限的最简单方法是,打开info.plist文件,然后选择Information Property列表旁边的+。在下拉列表中滚动至“隐私”选项,然后选择“隐私相机使用说明”以访问照相机,或选择“隐私照片库使用说明”以访问照片库。选择后,在右侧填写String值,以包含要在警报弹出时要求权限的情况下显示给用户的文本。相机/照片库权限


11

要获得照片应用的许可,您需要添加以下代码(快速3)

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

别忘了添加<key>NSPhotoLibraryUsageDescription</key> <string>You can select photos to attach to reports.</string>info.plist
marcomoreira92

太烂了,我没有任何问题。我在一个按钮中添加了此代码,我在iOS 10.3.1上使用我的iphone进行测试,并且效果很好
marcomoreira92 '17

3

我编写了一个扩展程序,其中考虑了所有可能的情况:

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

用法示例:

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

扩展代码:

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\"")
      }
   })
}

0

在执行相机会话的好方法斯威夫特5iOS版13

https://github.com/egzonpllana/CameraSession

Camera Session是一个iOS应用程序,试图使实现AVCaptureSession的最简单方法成为可能。

通过该应用程序,您可以找到实现的这些摄像头会话:

  • 本机相机拍摄照片或录制视频。
  • 导入照片和视频的本机方式。
  • 选择照片和视频等资产的自定义方式,并带有从“资源库”中选择一个或多个资产的选项。
  • 自定义相机,用于拍摄照片或视频,并带有按住按钮并进行录制的选项。
  • 分开的相机许可请求。

自定义相机功能包括割炬旋转相机选项。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.