3月13日から始まったプライバシーマニフェスト未対応の警告メールを受け取った

2024.03.14

2024年3月13日からApp Storeへの提出におけるプライバシー要件のアップデートが適用されている。要するにPrivacy Manifest対応をしていないアプリに対して警告メールが発信されるようになった。

警告メールは既存の仕組みに乗っかるらしいので、カメラAPIを使っているにも関わらずNSCameraUsageDescriptionが含まれていなかった時のように、アプリバイナリの送信後にApple側にて静的解析をおこない警告メールを送信するものを想定して対応を進めていた。

本記事では、Privacy Manifestに対応していないアプリを提出して、警告メールを受け取り、修正後に警告が消えることを確認したところまでを記している。また、想定しうるパターンでの検証をおこなった結果も追記した。

プライバシーマニフェスト対応の背景

2024年春から始まるという新しいプライバシー要件を遵守するため諸々準備してきた。DevelopersIOにもいくつか記事を投稿している。

そんな折、2月29日にApp Storeへの提出におけるプライバシー要件のアップデートに関する具体的なスケジュールが発表された。

Appleの発表を要約すると下記の通りとなる。

  • 3月13日から、特定のAPIを使用しているプライバシーマニフェストを含める必要がある。含まれていない場合にはアップロード時に開発者に通知される
  • 5月1日から、新規登録またはアップデートするアプリにおいて、プライバシー要件を満たしていることが義務付けられる。また、サードパーティーSDKに対しても同様に適用される

つまりは、3月13日から新しいプライバシー要件に準拠できているかのお試しできるようになり、5月1日からそれが厳密化されるということだ。

リリーススケジュールが自分の都合でコントロールできるプロダクトや個人開発アプリであれば、情報が出揃ったゴールデンウイークの春休み期間中にササっと対応するのはありだと思う。基本的には、厳密化されてから対応した方が効率的だろう。

注意! App Reviewに提出しないとプライバシーマニフェストに準拠できているかチェックが走らない

Appleの告知では、以下のように書かれており、App Store Connectへアップロードした時にアプリがプライバシー要件に準拠できていなければEメールにて連絡する、と読める。

3月13日以降:承認される理由が必要なAPIを使用している新規アプリまたは既存アプリのアップデートをApp Store Connectにアップロードする際に、アプリのプライバシーマニフェストに理由が含まれていない場合は、その旨をEメールでお知らせします。これは、App Store Connectの既存の通知に追加されます。

しかし、2024年3月14日時点では「App Reviewに提出」をしないとチェックが走らない。将来的には修正されそうではあるが注意しよう。

私自身は確認できていないが、SNSを見る限り、TestFlightの外部テストの審査時にもチェックが走るようだ。

プライバシーマニフェストに対応させるためにはどうすればよいか

アプリとサードパーティーSDK(ライブラリ)のそれぞれに PrivacyInfo.xcprivacy を追加すればよい。現時点で主要なライブラリはほぼ Privacy Manifest対応が完了しているので、ライブラリを最新版にアップデートした上で、アプリにマニフェストファイルを追加すれば良いだろう。

具体的には以下の記事を参照のこと。

3月13日から始まった新しいプライバシー要件に違反してみる

自作アプリ「Four Cropper」を題材にして仮説を立ててみる。画像を四分割するだけの簡単なアプリで、設定値を保存するためにUserDefaultsを使用している。よって、アプリ側に PrivacyInfo.xcprivacy ファイルが必要な認識だ。

現在、Four Cropperで利用しているライブラリは以下のものである。Appleに名指しされているサードパーティSDKについては、すべてPrivacyInfo.xcprivacyを追加済みである。

ライブラリ名 Apple名指しか? PrivacyInfo追加済みか?
FirebaseAnalytics o 追加済
FirebaseCrashlytics o 追加済
FirebasePerformance o 追加済
FirebaseRemoteConfig o 追加済
Google-Mobile-Ads-SDK o 追加済
SVProgressHUD o 追加済
RevenueCat x 追加済
CropViewController x なし
R.swift x なし
UIDeviceIdentifier x なし
UAObfuscatedString x なし
UITextView+Placeholder x なし
SwiftRater x なし
SwiftyStoreKit x なし
LicensePlistViewController x なし

このアプリを使って、新しいプライバシー要件に違反して警告メールを受け取ろうと思う。

検証その1:アプリのPrivacyInfoを含めていない場合

警告メールを受け取るため、アプリ側の PrivacyInfo.xcprivacy をわざと含めない形で、アプリのレビューに提出してみた。

結果としては警告メールが届いた。

警告メールを分析する

さて、どのような警告メールが届いたのか確認していこう。プライバシーマニフェストを含まないアプリを App Review に提出したところ、以下の警告メールが届いた。

Hello,
 

We noticed one or more issues with a recent submission for App Store review for the following app:
 

FourCropper
Version 4.0.2
Build 601
Although submission for App Store review was successful, you may want to correct the following issues in your next submission for App Store review. Once you've corrected the issues, upload a new binary to App Store Connect.
 

ITMS-91053: Missing API declaration - Your app’s code in the “MediaCropper” file references one or more APIs that require reasons, including the following API categories: NSPrivacyAccessedAPICategoryDiskSpace. While no action is required at this time, starting May 1, 2024, when you upload a new app or app update, you must include a NSPrivacyAccessedAPITypes array in your app’s privacy manifest to provide approved reasons for these APIs used by your app’s code. For more details about this policy, including a list of required reason APIs and approved reasons for usage, visit: https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api.
 

ITMS-91053: Missing API declaration - Your app’s code in the “MediaCropper” file references one or more APIs that require reasons, including the following API categories: NSPrivacyAccessedAPICategoryUserDefaults. While no action is required at this time, starting May 1, 2024, when you upload a new app or app update, you must include a NSPrivacyAccessedAPITypes array in your app’s privacy manifest to provide approved reasons for these APIs used by your app’s code. For more details about this policy, including a list of required reason APIs and approved reasons for usage, visit: https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api.
 

Apple Developer Relations

設定値の保存のためにUserDefaultsを使っているため、NSPrivacyAccessedAPICategoryUserDefaults が指摘されることは予想していた。だが、NSPrivacyAccessedAPICategoryDiskSpace が不足していることを指摘されるとは想定していなかった。

警告メールが来ないようにプライバシーマニフェスト対応をおこなう

NSPrivacyAccessedAPICategoryDiskSpace の利用が警告された件について調査をおこなった。「Describing use of required reason API」を確認しても、該当するAPIは利用していなかった。

ただ「Four Cropper」では分割した画像を共有する際に、Data#writeを使って画像を一時保存していたことを思い出した。

let sharePreviewURL = getUrl() 
do {
    try data.write(to: sharePreviewURL)
    return sharePreviewURL
} catch {
    return nil
}

当該部分の処理を削除したところ、 NSPrivacyAccessedAPICategoryDiskSpace の指摘を受けなくなった。Data#writeの内部実装は想像するしかないが、おそらくファイル書き込みの際に空き容量をチェックしてからストレージへ書き出しているのだろう。PrivacyInfo.xcprivacyNSPrivacyAccessedAPICategoryDiskSpace を追加することにした。

    <key>NSPrivacyAccessedAPITypes</key>
    <array>
        <dict>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>CA92.1</string>
            </array>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryUserDefaults</string>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>E174.1</string>
            </array>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryDiskSpace</string>
        </dict>
    </array>
</dict>
</plist>

後述するRealmSwiftも同様にNSPrivacyAccessedAPICategoryDiskSpaceの宣言が抜けており、マニフェスト修正版がリリースされていた。とにかく、この修正で App Reviewへの提出時に、警告メールも受け取らずに済むようになった。

検証その2:UserDefaultsを使っていて名指しされていないライブラリを組み込んでいる場合

「Appleに名指しされていない」かつ「UserDefaultsを使っている」ライブラリの場合はどうか?Four Cropper ではSwiftRaterというライブラリを使っている。

アプリをn回起動したらSKStoreReviewControllerを表示させるというライブラリである。3月14日時点ではプライバシーマニフェスト対応版はリリースされていない。非対応版のSwiftRaterを組み込んだ状態でアプリを申請した場合に警告メールは届くのか検証してみた。

結果としては警告メールは届かなかった。

Appleに名指しされていないサードパーティSDK(ライブラリ)が含まれている場合でもチェックされていないかもしれない。

検証その3:非対応版のFirebase Apple SDKを入れている場合

Firebase Apple SDKは、v10.22.0 にてプライバシーマニフェストに対応した。わざと非対応版に戻して、アプリを申請した場合に警告メールは届くのか検証してみた。

  # Firebase
  pod 'FirebaseAnalytics', "10.21.0"
  pod 'FirebaseCrashlytics', "10.21.0"
  pod 'FirebasePerformance', "10.21.0"
  pod 'FirebaseRemoteConfig', "10.21.0"

結果としては警告メールは届かなかった。

Appleに名指しされているサードパーティSDK(ライブラリ)が含まれている場合でもチェックされていないかもしれない。

検証その4:対応が不完全なライブラリを使っている場合

RealmSwiftは v10.48.1 でプライバシーマニフェスト修正版をリリースした。ファイル書き込みしているにも関わらず、NSPrivacyAccessedAPICategoryDiskSpace が欠けていたので追加したという内容だ。不完全な内容のライブラリを組み込み、審査に出してみるとどうなるのか。

結果としては警告メールは届かなかった。

Appleに名指しされているサードパーティSDK(ライブラリ)でもあっても、かつマニフェストの内容に誤りがあったとしてもチェックされていないかもしれない。

まとめ

検証結果を受け、3月13日から開始された「新しいプライバシー要件 (プライバシーマニフェスト対応)」に準拠しているかどうかのチェックは、以下のような挙動をしていることがわかった。

  • アプリのレビュー提出時にチェックが走る
  • UserDefaultsを使うライブラリも、特にチェックされていないかもしれない
  • そもそもライブラリは現時点ではチェックされていない可能性が高い

もちろん、これは2024年3月16日時点での検証結果である。前述した通り、将来的には仕様が変わる可能性は高いため、このまとめは恒久的なものではない点に注意すること。

変更履歴

  • 2024年3月16日:「UserDefaultsを使っていてApple名指しされていないライブラリを組み込んでいる場合」と「非対応版のFirebase Apple SDKを入れている場合」「対応が不完全なライブラリを使っている場合」の検証結果を追加
  • 2024年3月14日:初版公開