这是 iOS 8+ 的完整指南(没有 ALAssetLibrary):
首先,我们必须提供使用说明,因为现在PHPhotoLibrary需要它。
为此,我们必须打开文件info.plist
,找到密钥Privacy - Photo Library Usage Description
并为其提供值。如果密钥不存在,则只需创建它。
这是一个图像示例:
还要确保文件中的键值Bundle name
不为空info.plist
。
现在当我们有描述时,我们通常可以通过调用requestAuthorization
方法请求授权:
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
switch (status) {
case PHAuthorizationStatusAuthorized:
NSLog(@"PHAuthorizationStatusAuthorized");
break;
case PHAuthorizationStatusDenied:
NSLog(@"PHAuthorizationStatusDenied");
break;
case PHAuthorizationStatusNotDetermined:
NSLog(@"PHAuthorizationStatusNotDetermined");
break;
case PHAuthorizationStatusRestricted:
NSLog(@"PHAuthorizationStatusRestricted");
break;
}
}];
注意 1: requestAuthorization
实际上并不是每次通话都显示警报。它每隔一段时间显示一次,保存用户的答案并每次返回,而不是再次显示警报。但由于这不是我们需要的,这里有一个有用的代码,每次我们需要权限时总是显示警报(重定向到设置):
- (void)requestAuthorizationWithRedirectionToSettings {
dispatch_async(dispatch_get_main_queue(), ^{
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusAuthorized)
{
//We have permission. Do whatever is needed
}
else
{
//No permission. Trying to normally request it
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status != PHAuthorizationStatusAuthorized)
{
//User don't give us permission. Showing alert with redirection to settings
//Getting description string from info.plist file
NSString *accessDescription = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSPhotoLibraryUsageDescription"];
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:accessDescription message:@"To give permissions tap on 'Change Settings' button" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil];
[alertController addAction:cancelAction];
UIAlertAction *settingsAction = [UIAlertAction actionWithTitle:@"Change Settings" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}];
[alertController addAction:settingsAction];
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alertController animated:YES completion:nil];
}
}];
}
});
}
常见问题1:部分用户抱怨info.plist
在对文件进行上述更改后,应用程序没有显示警报。
解决方案:为了测试尝试Bundle Identifier
从项目文件更改为其他文件,清理并重建应用程序。如果它开始工作,那么一切都很好,将其重命名。
常见问题 2:当应用程序在按照文档中承诺的方式运行时,当应用程序获得照片权限时,没有更新获取结果(并且使用来自这些获取请求的图像的视图仍然相应地为空),存在一些特定情况。
实际上,当我们使用这样的错误代码时会发生这种情况:
- (void)viewDidLoad {
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
//Reloading some view which needs photos
[self reloadCollectionView];
// ...
} else {
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusAuthorized)
[self reloadCollectionView];
// ...
}];
}
// ...
}
在这种情况下,如果用户拒绝授予权限viewDidLoad
然后跳转到设置,允许并跳转回应用程序,则不会刷新视图,因为[self reloadCollectionView]
未发送获取请求。
解决方案:我们只需要[self reloadCollectionView]
在需要授权之前调用并执行其他获取请求,如下所示:
- (void)viewDidLoad {
//Reloading some view which needs photos
[self reloadCollectionView];
if ([PHPhotoLibrary authorizationStatus] != PHAuthorizationStatusAuthorized)
{
// ...
}