iOS 首次访问相册权限,因弹窗被拒!
Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage
We noticed that your app requests the user’s consent to access their camera, photos, and microphone but does not clarify the use of this feature in the permission modal alert.
Next Steps
To resolve this issue, please revise the permission modal alert to specify why the app is requesting access to the user's camera, photos, and microphone.
The permission request alert should specify how your app will use this feature to help users understand why your app is requesting access to their personal data.
被拒理由大概解释为:
你的app需要访问用户的相册权限,但是你并没有在弹窗时清楚的解释为什么要访问,用相册要干什么?
我以前的说明是:“请求访问您的相册”
更改为:“上传照片信息时需要访问您的相册”,即可!
//相册权限
<key>NSPhotoLibraryUsageDescription</key>
<string>上传照片信息时需要访问您的相册</string>
//相机权限
<key>NSCameraUsageDescription</key>
<string>上传照片信息时需要使用您的相机</string>
同时我还发现一个问题,首次访问相册权限,app并没有出弹窗提示!
这是因为相册请求状态开始的第一次是PHAuthorizationStatusNotDetermined = 0
用户尚未选择应用程序是否可以访问照片库,也就是说相册权限弹框默认是不出来的,所以用户点击按钮的时候我们要主动再请求一次。
* 相册访问权限iOS8之前,相册权限弹窗拦截
首先要导入头文件@import AssetsLibrary;
if ([ALAssetsLibrary authorizationStatus] == ALAuthorizationStatusNotDetermined) {
ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
// 用户点击 "OK"
} failureBlock:^(NSError *error) {
// 用户点击 不允许访问
}];
}
ALAuthorizationStatus解释
typedef NS_ENUM(NSInteger, ALAuthorizationStatus) {
// 用户还没有对这个应用程序做出选择
ALAuthorizationStatusNotDetermined NS_ENUM_DEPRECATED_IOS(6_0, 9_0) = 0,
// 这个应用程序未被授权访问图片数据。用户不能更改该应用程序的状态,可能是由于活动的限制,如家长控制。
ALAuthorizationStatusRestricted NS_ENUM_DEPRECATED_IOS(6_0, 9_0),
// 用户已经明确否认了这个应用程序访问图片数据
ALAuthorizationStatusDenied NS_ENUM_DEPRECATED_IOS(6_0, 9_0),
// 用户授权此应用程序访问图片数据
ALAuthorizationStatusAuthorized NS_ENUM_DEPRECATED_IOS(6_0, 9_0)
}
* 相册访问权限iOS8之后,相册权限弹窗拦截
在iOS8.0系统以后,加入了Photos.framework框架,我们可以利用框架中的PHAuthorizationStatus进行权限状态判断。
首先导入头文件@import Photos;
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusNotDetermined) {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if(status == PHAuthorizationStatusAuthorized) {
dispatch_async(dispatch_get_main_queue(), ^{
// 用户点击 "OK"
});
} else {
dispatch_async(dispatch_get_main_queue(), ^{
// 用户点击 不允许访问
[self.navigationController popViewControllerAnimated:YES];
});
}
}];
}
PHAuthorizationStatus解释
typedef NS_ENUM(NSInteger, PHAuthorizationStatus) {
//用户尚未选择客户端是否可以访问照片库
PHAuthorizationStatusNotDetermined = 0,
//此应用程序没有被授权访问照片数据,可能是家长控制权限
PHAuthorizationStatusRestricted,
//用户已经明确的拒绝这个应用程序访问照片库
PHAuthorizationStatusDenied,
//用户已经授权这个应用程序可以访问照片数据
PHAuthorizationStatusAuthorized
}
这样,App第一次访问相册权限就可以完美的弹窗了!