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)
{
// ...
}