iOSエンジニアのつぶやき

主に iOS 関連の技術について毎日つぶやいています。まれに釣りについてつぶやく可能性があります。

PHAuthorizationStatus の .limited とは?

Xcode12 の対応に伴って、新しく出た warnings を修正しようとしていると、PHAuthorizationStatus 周りで何やら Switch must be exhaustive という warning が発生していました。 全てのケース網羅してるはずだけどな〜と思い、PHAuthorizationStatus のソースを確認して見ると、何やら .limited というもの iOS14 から追加されていました。

@available(iOS 8, iOS 8, *)
public enum PHAuthorizationStatus : Int {

    
    @available(iOS 8, *)
    case notDetermined = 0 // User has not yet made a choice with regards to this application

    @available(iOS 8, *)
    case restricted = 1 // This application is not authorized to access photo data.

    // The user cannot change this application’s status, possibly due to active restrictions
    //   such as parental controls being in place.
    @available(iOS 8, *)
    case denied = 2 // User has explicitly denied this application access to photos data.

    @available(iOS 8, *)
    case authorized = 3 // User has authorized this application to access photos data.

    @available(iOS 14, *)
    case limited = 4 // User has authorized this application for limited photo library access. Add PHPhotoLibraryPreventAutomaticLimitedAccessAlert = YES to the application's Info.plist to prevent the automatic alert to update the users limited library selection. Use -[PHPhotoLibrary(PhotosUISupport) presentLimitedLibraryPickerFromViewController:] from PhotosUI/PHPhotoLibrary+PhotosUISupport.h to manually present the limited library picker.
}

.limited とは?

iOS14 から Limited Photos Library というものが追加されたらしく、ユーザがフォトライブラリーの許可ダイアログで、Select Photos... を選択した時の、PHAuthorizationStatus.limited になるようです。また、既存の PHPhotoLibrary.requestAuthorization リクエストを使用している場合は、ユーザが Select Photos... を選択した場合、PHAuthorizationStatus.authorized になります。.limited として値を受け取りたい場合は、PHPhotoLibrary.requestAuthorization(for: PHAccessLevel)PHAccessLevel を指定する必要があります。

余談

Select Photos... を選択した場合は、アプリでアクセス可能にする写真を選択するため PHPickerViewController が別プロセスで起動されます。これらのプロセスは、アクセス毎に選択する写真を変更するかどうかダイアログが表示されます。毎回アラートを表示させたくない場合は、info.plistPHPhotoLibraryPreventAutomaticLimitedAccessAlert で制御する必要があります。

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com