iOS 14+用PHAccessLevel.addOnly查询相册权限始终返回notDetermined
问题原因
- 核心是API使用不匹配:iOS 14新增分级别相册权限后,请求时指定了
PHAccessLevel.addOnly,查询状态时却调用了无参的旧方法PHPhotoLibrary.authorizationStatus(),这个无参方法默认查询的是readWrite级别的权限状态,你从未申请过读写权限,所以返回值永远是notDetermined,和模拟器本身无关。 - 你测试时用
readWrite请求能正常返回结果,也刚好验证了这个逻辑:因为无参查询的就是读写权限的状态,请求和查询的级别匹配,结果自然正确。
修正方案
1. 替换权限查询方法
iOS 14及以上版本,请求什么级别的权限,就查询对应级别的状态,同时做好iOS 10~iOS 13的旧版本兼容:
import Photos func authorizationStatusPhotos() { // iOS 14及以上版本适配 if #available(iOS 14, *) { // 请求仅添加照片权限 PHPhotoLibrary.requestAuthorization(for: .addOnly) { _ in // 必须查询对应addOnly级别的权限状态 switch PHPhotoLibrary.authorizationStatus(for: .addOnly) { case .notDetermined: print("notDetermined") case .restricted: print("restricted") case .denied: print("denied") case .authorized: print("authorized") case .limited: // addOnly级别不会返回limited,该状态仅属于readWrite级别 print("limited") @unknown default: print("default") } } } else { // iOS 10 - iOS 13 旧版本适配 PHPhotoLibrary.requestAuthorization { status in switch status { case .notDetermined: print("notDetermined") case .restricted: print("restricted") case .denied: print("denied") case .authorized: print("authorized") @unknown default: print("default") } } } }
2. 补充Info.plist权限声明
- 如果仅需要添加照片权限,添加
NSPhotoLibraryAddUsageDescription,填写权限申请的用途说明 - 如果需要读写相册权限,添加
NSPhotoLibraryUsageDescription
补充说明
部分旧版本Xcode的iOS 14模拟器确实存在相册权限缓存异常的问题,如果修正代码后仍有异常,可以重置模拟器内容与设置后重新测试,真机不会存在该类问题。
内容的提问来源于stack exchange,提问作者user4806509
相关产品推荐
相关产品推荐

