[iOS]写真へのアクセスレベル「追加のみ」「閲覧・追加両方」を１アプリ内に混在させる時どうなるか

## 基本事項

iOSアプリの写真（カメラロールなど）へのアクセス許諾についての基本は以下をご覧ください

[WWDC2020での許諾周りのアップデートまとめ](https://qiita.com/akatsuki174/items/cc59203c2f3b1fe83573#写真)

簡単にまとめると以下のようになります。

### iOS13以前
写真へのアクセス権限は一種類（閲覧・追加両方）しかなく、その許諾ダイアログは二択のダイアログである。
![2択ダイアログ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392332/65f7a47a-421d-b994-084b-268f4a6a57fb.png)

許諾の状態をチェックする時は[`PHAuthorizationStatus`](https://developer.apple.com/documentation/photokit/phauthorizationstatus)を使う。

ユーザーに許諾を得る時は[`requestAuthorization(_:)`](https://developer.apple.com/documentation/photokit/phphotolibrary/1620736-requestauthorization)を使う。

許諾ダイアログの文言は[`NSPhotoLibraryUsageDescription`](https://developer.apple.com/documentation/bundleresources/information_property_list/nsphotolibraryusagedescription)が適用される。

### iOS14
iOS14では写真へのアクセス権限として「追加のみ」の権限と「閲覧・追加両方」の権限がある。

- 「追加のみ」の権限を得る時の許諾ダイアログはやはり二択のダイアログとなる。例えば、画像保存機能の時はこれを使う事になる。![2択ダイアログ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392332/65f7a47a-421d-b994-084b-268f4a6a57fb.png)

許諾の状態をチェックする時は[`authorizationStatus(for: .addOnly)`](https://developer.apple.com/documentation/photokit/phphotolibrary/3616052-authorizationstatus)を使う。

ユーザーに許諾を得る時は[`requestAuthorization(for: .addOnly)`](https://developer.apple.com/documentation/photokit/phphotolibrary/3616053-requestauthorization)を使う。

許諾ダイアログの文言は[`NSPhotoLibraryAddUsageDescription`](https://developer.apple.com/documentation/bundleresources/information_property_list/nsphotolibraryaddusagedescription)が適用される。

- 「閲覧・追加両方」の権限を得る時は、三択のダイアログとなる。例えば、画像アップロード機能の時はこれを使うことになる。
![3択ダイアログ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392332/c81527ed-901f-265e-1bd3-c199e21f5b26.png)

許諾の状態をチェックする時は[`authorizationStatus(for: .readWrite)`](https://developer.apple.com/documentation/photokit/phphotolibrary/3616052-authorizationstatus)を使う。

ユーザーに許諾を得る時は[`requestAuthorization(for: .readWrite)`](https://developer.apple.com/documentation/photokit/phphotolibrary/3616053-requestauthorization)を使う。

許諾ダイアログの文言は、iOS13以下と同じで[`NSPhotoLibraryUsageDescription`](https://developer.apple.com/documentation/bundleresources/information_property_list/nsphotolibraryusagedescription)が適用される。

## iOS14で「追加のみ」「閲覧・追加両方」を１アプリ内に混在させられるが、するとどうなるか

例えば、１アプリ内に画像保存機能（追加のみ）と画像アップロード機能（閲覧・追加両方）が両方ある場合など。

### 許諾文言の整理

許諾文言はinfo.plistに`NSPhotoLibraryUsageDescription`と`NSPhotoLibraryAddUsageDescription`の二つの固定文言を書いていくことになる。

info.plistの内容をiOSのバージョンが13以下か14以降かによって動的に変えることはできない（はず）なので、全状況をカバーできる文言を入れていくしかない。※もし変える方法を知ってる場合は教えてください・・・

以下のように表で整理するとわかるが、NSPhotoLibraryUsageDescriptionは画像アップロード機能と画像保存機能両方の時に表示されうるので、両方の機能についての説明を入れていかなければならないと考えられる。

一方、`NSPhotoLibraryAddUsageDescription` はiOS１４で画像保存機能を使う時に表示される可能性があるだけであるから、画像保存機能についての説明さえ入っていればいいと考えられる。

|  | 画像アップロード機能（閲覧・追加両方） | 画像保存機能（追加のみ） |
|:-----------|------------:|:------------:|
| iOS13以前      | NSPhotoLibraryUsageDescription      | NSPhotoLibraryUsageDescription   |
| iOS14    | NSPhotoLibraryUsageDescription       | `NSPhotoLibraryAddUsageDescription`     |

### iPhoneの「設定」アプリ > 「写真」はどのような設定となるか
#### ケース１ 最初に画像保存機能を使用 -> その後画像アップロード機能を使用
画像保存機能を使う時、`requestAuthorization(for: .addOnly)`でユーザーに許諾を得る。許諾が得られた場合、iPhoneの「設定」アプリ > 該当アプリ > `Photos`を見てみると、以下のように追加のみか不許可かの二択になる。
![追加のみ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392332/cdfa87e1-cc89-1f6c-f142-ba71c2fbcc4c.png)

その後、画像アップロード機能を使う時、`requestAuthorization(for: .readWrite)`でユーザーに許諾を得ることになる。iPhoneの「設定」アプリ > 該当アプリ > `Photos`を見てみると、以下のように「追加のみ」「特定の写真のみ」「全部の写真」「不許可」の四択となる。
![設定アプリ > 画像 add onlyを含む.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392332/9732bea8-260e-e886-c207-6a558dc9d555.png)

#### ケース2 最初に画像アップロード機能を使用 -> その後画像保存機能を使用
最初`requestAuthorization(for: .readWrite)`でユーザーに許諾を得ることになる。許諾を得られると、設定アプリでは「特定の写真のみ」「全部の写真」「不許可」の三択となる。
![設定アプリ > 画像 add onlyを含まない.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392332/c3fb1133-a3f0-0da6-9876-808031406219.png)

その後、画像保存機能を使う時は、すでに閲覧・追加両方の権限が得られていることから、改めてユーザーに許諾を得る必要はないから、そのまま画像保存機能が使えることになる。

最終的に、順番によって「設定」の「写真」の選択肢が３つと４つで異なってくることになり、少し気持ち悪いが・・・