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
実際には、すべての通話でアラートが表示されるわけではありません。一定時間に1回表示され、ユーザーの回答を保存して、アラートを再度表示する代わりに毎回それを返します。しかし、これは私たちが必要とするものではないので、許可が必要になるたびに常にアラートを表示する便利なコードがあります(設定へのリダイレクトあり):
- (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:ドキュメントで約束されたとおりに実行しているときに、アプリが写真へのアクセス許可を取得すると、フェッチ結果が更新されない(そして、それらのフェッチリクエストからの画像を使用するビューが空のままである)場合があります。
実際、次のようなWRONGコードを使用すると発生します。
- (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)
{
// ...
}