ChatGPT解决这个技术问题 Extra ChatGPT

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

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

当用户选择上述方法之一(拍照或照片库)时,如何推送权限请求?

我将 Swift 3.0 与 WKWebView 一起使用。

@KiritModi 嗨,非常感谢。您能否将其发布为答案,以便我接受。
仅供参考:UIImagePickerController 文档从未针对此 iOS10+ 要求进行更新(我浏览了每一页,包括遗留的 Objective-C 文档)

G
George Vardikos

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

斯威夫特 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 4 的人,第一行应更改为:“AVCaptureDevice.requestAccess(for: AVMediaType.video) { response in”。
感谢您的回答。它完美地工作。不过,我想知道一件事。当您运行 requestAuthorization 时,它是否会创建某种侦听器,等待设置权限后再运行它的代码?起初我虽然代码执行只是在 PHPhotoLibrary.authorizationStatus 处停止,但是在丢弃了一堆打印语句之后,它似乎还在继续?
斯威夫特 3AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { response in。不要忘记import AVFoundation
感谢你的回答。没有它,我的应用程序被拒绝,因为应用程序可以在未经许可的情况下访问照片库。
我们仍然需要更新 info.plist
K
Kirit Modi

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

嗨,我实际上无法让 iPhone7 用户设置照片库权限。当 iPhone7 用户在手机上访问我的应用程序设置时,缺少照片库选项。我的 info.plist 中有上面提到的 Key:Value。奇怪的是所有运行 iOS 10 的设备都可以看到这个选项,除了 iPhone7 用户。例如,运行 iOS 10 的 iPhone6 可以看到这个选项。我还缺少其他东西吗?
您不应在这些值中包含 PRODUCT_NAME,因为 Apple 消息中已包含该名称。例如“应用程序名称”想访问您的照片
V
Vishal Vaghasiya

信息列表

有限的照片

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

西里

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

w
wjl

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

斯威夫特 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)
      }
    }
  }

E
Ed of the Mountain

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

e
elarcoiris

https://i.stack.imgur.com/ER39g.png


m
marcomoreira92

要请求照片应用程序的权限,您需要添加以下代码(Swift 3):

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

不要忘记在 info.plist 中添加 <key>NSPhotoLibraryUsageDescription</key> <string>You can select photos to attach to reports.</string>
斯坦格,我没有任何问题。我在一个按钮中添加了这段代码,我正在使用我的 iphone 和 iOS 10.3.1 进行测试,它工作正常
d
dronpopdev

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

如果允许访问,则将运行代码 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)
            }
         }))
         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\"")
      }
   })
}

嘿@dronpop,您的解决方案很好,我使用了它,但是当我第一次安装应用程序并且不允许时,应用程序会崩溃。你能告诉我如何解决它吗?
@RanaAliWaseem,我修复了崩溃。您很可能遇到了 this 问题中描述的错误。
我从后台线程调用了这个崩溃 iyziliOSApp[3585:195420] [Animation] +[UIView setAnimationsEnabled:]。不支持从后台线程对 UIView 或子类执行任何操作,这可能会导致意外和隐蔽行为。 trace=( 然后由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“在从主线程访问布局引擎后,不得从后台线程对其进行修改。
是的,正如你提到的问题,我得到了这个,但如何解决它?
@RanaAliWaseem fix
A
Abhimanyu Rathore

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

相片 :

Privacy - Photo Library Additions Usage Description

Privacy - Photo Library Usage Description

相机:

Privacy - Camera Usage Description

最好在 Apple 的技术文档中详细检查所有受保护资源(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

谢谢!:)


E
Egzon P.

在 Swift 5、iOS 13 中实现相机会话的好方法

https://github.com/egzonpllana/CameraSession

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

通过该应用程序,您可以找到已实现的这些相机会话:

用于拍照或录制视频的本机相机。

导入照片和视频的本地方式。

选择照片和视频等资产的自定义方式,可以从库中选择一个或多个资产。

自定义相机拍摄照片或视频,可选择按住按钮和录制。

分离的相机权限请求。

自定义相机功能,如手电筒和旋转相机选项。