🍎

iOSのPrivacyManifest対応方法 Flutter篇

2024/02/08に公開

追記2024/03/01

3/13以降にアプリをAppStoreにあげると対応不足の場合はメールが来るようになるそうです。
対応期限も5/1までになりました。
https://developer.apple.com/news/?id=3d8a9yyh

PrivacyManifestとは

アプリまたはサードパーティ SDK が収集するデータと、使用する API が必要な理由について説明を記載せよ
https://developer.apple.com/documentation/bundleresources/privacy_manifest_files

AppleがWWDC2023で発表し、データを収集する目的や特定のAPIを使う理由をユーザーに対して説明することを求める新しいルール。2024春までに対応しろと言われている
対応しなかった場合は審査に通過しない可能性がある
また、ドキュメントに記載が見つからなかったですが、ガイダンス?にはデータを収集しなくても空のPrivacyManifestを用意する必要があるとのことです

また、AppStoreConnectにアプリをアップロードした際にPrivacyManifestを確認する仕組みをAppleは導入する予定とのことなので、このあたりの確認はしやすくなるかと思います(2024/2現在まだ未実装)

対応が必要なデータ収集とは?

https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests
ストアの「アプリのプライバシー」をアプリ側に埋め込むようにした感じ

対応が必要なAPIは?

https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api

Flutter側で上記を直接触ることは基本的にないと思うので、3rd-Partyプラグインの実装を調べる必要がある

Appleから名指しで対応が必要と言われてるSDK

以下はiOSのライブラリだけじゃなくてFlutterのプラグインも名指しで言われているのは面白かった

  • connectivity_plus
  • device_info_plus
  • file_picker
  • Firebase系
  • flutter_inappwebview
  • flutter_local_notifications
  • fluttertoast
  • geolocator_apple
  • image_picker_ios
  • package_info
  • package_info_plus
  • path_provider
  • path_provider_ios
  • sqflite
  • url_launcher
  • url_launcher_ios
  • video_player_avfoundation
  • wakelock
  • webview_flutter_wkwebview

https://developer.apple.com/support/third-party-SDK-requirements/

アプリの対応方法

Xcodeを15まで上げてPrivacyInfo.xcprivacyをプロジェクトに追加します
作り方についてはAppleの公式ドキュメントを参考にします

おそらく、プラグインのPrivacyManifestなどをマージして統合される仕組みだと思うので(AndroidのAndroidManifestみたいなイメージでいます)、アプリ側で必要な設定は多くない気がしています。

たとえば、今のプロジェクトではNSUserDefaultをアプリ側で直接呼ぶことはなく、プラグイン経由で呼び出すことが多いと思いますが、その場合はプラグイン側がPrivacyManifestに対応していれば、アプリ側で明示的に記述する必要はないと思います(間違っていたらすいません)

一方で、NSPrivacyCollectedDataType ではアプリ側(認証機能など)で個人情報などを保存している箇所は明示が必要かと思います
たとえば、Eメールアドレスを認証につかって自サーバー側で保存している場合は、NSPrivacyCollectedDataTypeEmailAddress の宣言が必要だと思います
ただFirebaseAuthを使ってる場合はEメールアドレスはFirebaseに保存されているのでFirebaseのプラグイン側で宣言で足りるのか、アプリ側でも宣言が必要なのかは、Firebase側の対応を見ながら調整したいと考えています

プラグインの対応状況の調べ方

pubspec.yamlに書いてあるプラグインのリポジトリを1つずつ確認します
自分はスプレッドシートにプラグインの一覧をコピペしてメモしながらまとめました

見る箇所

1)iOSのコードがあるか

まずiOSのコードを叩かれていそうかどうかを見ます
リポジトリのパッケージルートに ios or darwin がなければDartのみで記述されているので対応は不要です
ただFederatedPluginなどで別packageにiOS版が分かれてる場合もあるのでそこも確認したほうがいいでしょう

2)PrivacyInfo.xcprivacyがあるか

(ios|darwin)/Resources/PrivacyInfo.xcprivacy があればそのプラグインは対応済みなので、対応バージョンまでアップデートすれば大丈夫です

3)PrivacyInfo.xcprivacyはないけどIssueがあるか

PrivacyInfo.xcprivacyがなくても対応予定であれば問題ないのでIssueでPrivacyとかで検索して対応Issueを探します。いくつかのプラグインではIssueは立っているが対応中・検討中というのもありました。

4)CocoaPodsでiOSライブラリを呼んでる場合は呼び出し先の対応も一応確認

Flutterプラグインの (ios|darwin)/xxx.podspecのなかで s.dependency 'XXX' という記述があればXXXというiOSのライブラリを使ってる可能性があります。
この場合Flutterのプラグイン側にManifestを置くだけだとダメそうな気がしており、呼び出し先のiOSプロジェクトの対応も必要な気がしているので一応確認するのが良いともおもいます。ケースとしてはあまり多くないはず

対応されるかわからないプラグインについて

ひとまずまだ2ヶ月ほどあるので、Issueを立てたり、APIが使われてないandデータ収集してないのであれば空ManifestのPRを送ってもいいかもしれません

困ったケース

メンテ死んでそう

今のプロジェクトだとimage_cropperという画像切り抜きUIを提供してくれるプラグインを使っているのですが、内部的にはiOSのTOCropViewControllerをつかっており、こちらのメンテが2年前で止まっているようで対応自体されないかもしれません

この場合、他の対応プラグインに乗り換えるか、もとのTOCropViewControllerをフォークしたものを対応してimage_cropper側でそれを使ってもらうみたいなちょっとめんどくさいことをしないといけないので頭を抱えています。。。

ご意見・コメントお待ちしております

なんか延期しそうな気もしつつ、3rdParty側の対応も結構進んでいて助かりました。
うちもやばそうとか、もっといいやり方があるとかあれば教えてもらえると助かりますmm

Discussion