anz blog

Widget の Privacy Manifest 対応

2024-03-27 #Swift

5月から本格的に始まる Privacy Manifest ですが、現時点でもすでにマニフェストを内包している場合は、バリデーション(目的の記載が必要なAPIを利用しているのにそれが未記載など)がはしって何か不足していればメールでお知らせが来るようになっているので、いまから準備に余念がない人も多いでしょう。
もちろん僕もその一人なのですけれど、そこらでちょっとゴニョゴニョしてたのでそこらの話。

はじめに

この内容は 3.27 時点での話です。
今後、AppStoreConnect 側で走るバリデーションの仕様とかが変わるかもしれません。

Widget 側で不足していると怒られる

提出して送られてきたメールの内容としては下記のようなもの。

ITMS-91053: Missing API declaration - Your app’s code in the “WidgetExtension” file references one or more APIs that require reasons, including the following API categories: NSPrivacyAccessedAPICategoryUserDefaults.

Widget Extension で UserDefaults を使っているのにその使用目的が記載されていないぞ。というものです。

やってみたその1

本体側に UserDefaults については CA92.1 で記載してあるのでそれで全部カバーできるかと考えてはいたのですけれど、そういうわけでもなさうです。
ただここでドキュメントみなおしてたら、そもそも CA92.1 では不備があるなということに思い至りました。

## CA92.1

Declare this reason to access user defaults to read and write information that is only accessible to the app itself.

## 1C8F.1

Declare this reason to access user defaults to read and write information that is only accessible to the apps, app extensions, and App Clips that are members of the same App Group as the app itself.

UserDefaults で設定できる理由の一部を抜粋しましたが、 CA92.1 はアプリ本体のみで、 1C8F.1 は本体と同じ App Group に含まれる拡張も利用する。という違いがあって、Widget Extension で UserDefaults を使っているので後者の設定が適切そうです。
そこで「本体側で設定している理由のカバー領域が不足していてこれでは Widget の方は使用許可できません」という意図で、メールのような定型文警告がきてるのかな?とふと思ってしまったので、 一旦本体のほうを CA92.1 から 1C8F.1 に変更だけして提出してみました。
結果、同じ内容のメールが返ってきました。
どうやら、素直に別途 Widget Extension 用の Privacy Manifest が必要そうです。

ちなみに Xcode 15.2 では 1C8F.1 は自動補完されないので手動で入力しました。

やってみたその2

設定していた理由が駄目で警告メールが送られてきたわけではないということがわかったので、Widget Extension の方にも Privacy Manifest を追加して、 UserDefaults を使う理由 1C8F.1 だけを記載して、再度提出してみました。
結果、今度は無事にメールで指摘された箇所は解消されました :tada:

ということで、本体とは別ターゲット内で「理由が必要なAPI」を使っている場合は、あらかじめ別途 Privacy Manifest を用意して記載しておいたほうがよさそうです。

それはそれとして、「収集するデータの使用目的」の方の説明には

App extensions don’t include privacy information files. The operating system and App Store Connect use the privacy information file in the extension’s host app bundle, in combination with those from third-party SDKs your app links to.

という一文があるので、API 側の方も後に本体側にだけ記載しておけばよくなったりしないかなぁ?とか思っていたりもします(笑)

参考