smartroundのFlutterアプリでApple Privacy Manifests対応をはじめてやった
エンジニアをやっている福本です。
スマートラウンドは、2023年10月に初のスマートフォンアプリをリリースしました👇
チャット機能をメインとしたアプリで、Flutterで開発されています。
メインのプロダクトはSaaSのWebアプリケーションであり、専任のFlutter開発者がいない中で、今回Apple Privacy Manifests対応を進める必要性が出てきました。今回はそのメモを残したものとなります。
ちなみに、この対応は私だけでなく、同じくアプリ開発を担当するshitake4さん、およびSREの方々に多大なるご協力いただき完了したものです。本当にありがとうございました!(「ブログネタを横取りしてないよ」というアピールです 👍)
Tl; Dr
✍️書いてあること
- Flutterで開発された、比較的新しいアプリでのApple Privacy Manifests対応
- リソースが少ない中でどう進めたか
- 方針をどう決めたか
- 対応のタイムライン
⛔ 書かれていないこと
- FlutterおよびiOSアプリ開発におけるApple Privacy Manifests対応のベストプラクティス
やったこと
1. Privacy Manifest対応の情報をキャッチする
そもそも本対応についてはAppleからWWDC23で発表されたとのことですが、当時私たちはそんなことは露知らず、アプリのファーストリリースに向けてバリバリとFlutterアプリの開発を進めていました。
その後、アプリが無事リリースされ初期開発も落ち着いてきたときに、SREの和田さんが「Privacy Manifestとやらの対応が必要そう」ということをキャッチして教えてくれました。これが神か... 🙏
SlackにPostされた天啓
ちなみに、和田さんはクラスメソッドさんの以下の記事を見てキャッチアップしてくれたみたいです👇
私たちも対応にあたり、大いに参考にさせていただきました!
2. 内容を確認し、対応方針と役割分担を決める
というわけで、必要そうな対応をチームで めちゃくちゃ急いで 確認しました。しかも対応期限が「2024年春」と書かれており(当時、具体的な日時はわからず)、下手すると以降のアプリ審査でRejectを食らう可能性があるとのこと。
「これは急いでやらなアカン!」と理解し、チームで優先度上げて対応することに決めました。
社内で色々と調べたドキュメント(頑張ってる姿が見える)
調べた結果、大まかには以下2点の対応が必要なことがわかりました。これらの対応のため、以降の作業を進めていった感じです。
- 自社アプリ自体のPrivacy Manifests対応
- FlutterのSDKのPrivacy Manifests対応(がされたバージョンを利用)
a. 対応が必要な機能の利用/データの取得をしていないか確認
まず、自社アプリ自体のPrivacy Manifests対応にあたり、該当する機能およびデータを取得していないかを確認しました。 該当機能やデータはApple公式のドキュメントから愚直にリスト化して、片っ端からチェックを進めました。
NSPrivacyTracking
など、自社が取得しているデータが該当するかの判別が難しいものもあったため、この箇所についてはアプリチーム内で完結させずSREと連携して進めた感じです
これも社内で色々と洗い出したドキュメント
SaaSプロダクトの補助的な利用をするケースが多いアプリであり、広告や位置情報などを使うものではなかったので、該当する機能やデータの取得は少なくて済みました。
b. Privacy Manifestsを作成
aで洗い出した該当機能の利用やデータの取得をしていた場合、その使われ方を調査してその目的をios/Runner/PrivacyInfo.xcprivacy
に書く必要があります
以下は Email address
のデータを集めている場合に、データの使われ方と目的を記載した具体的な例です👇
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>Email address</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeDeveloperAdvertising</string>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
公式ドキュメントに書き方や項目が記載されているので、そちらを参考にすると良さそうに思います 🍎
c. Privacy Manifest対応されたライブラリを使用しているか確認
ここまでは、「自分たちのFlutterアプリの状況」について、その回答を整理してファイルに内容を記載しました。次に、「ライブラリも、Privacy Manifest対応されたものを利用する」という点を対応していく必要があります。
まず、以下のURLでAppleから対応が必要なライブラリが名指しされているので、これを使っているかどうかをpubspec.yaml
ファイルを見ていきます。
該当したライブラリに関しては、GitHubのRepositoryを見て、Privacy Manifests対応が終わり ios/Runner/PrivacyInfo.xcprivacy
が存在するかを確認しました。
存在した場合は、Releasesを見てライブラリのどのバージョンでPrivacy Manifests対応がされたかを確認し、Flutterアプリでその対応バージョンまでアップデートする...という手順を行いました。
url_launcherで実際に対応したPR
また、Privacy Manifests対応が終わっていないライブラリも存在したため、その場合は対応を進めるissueが存在するかどうかを確認しました。幸運にもメンテされていないライブラリを使っていなかったこともあり、全てで対応が進みそうなissueが積まれていました。
その後、ライブラリに関しては時間を空けて後ほどチェック...という流れでアップデートを進めていきました。開発者間で定期的にコミュニケーションを取れていたので、アップデートの進捗を確認して進めやすかったです。
社内で洗い出して対応状況を管理していたドキュメント
d. XcodeでPrivacy Reportを作成し内容を確認
XcodeでArchiveからPrivacy Reportを作成します。
bで作成したios/Runner/PrivacyInfo.xcprivacy
の内容に沿ったレポートが出力されます。
出力されたレポートの内容が、ここまで整理した内容と相違ないかを確認しましょう。
(レポートの出力方法はこちらの記事がわかりやすいです👇)
こういうのが出力されます
ちなみに、App Store Connectにも「アプリのプライバシー」を記載する箇所があります。
これは、(私たちのアプリがリリースされる前の)2020年に記載が義務化されたもののようです👇
今回のPrivacy Manifests対応とは別件ですが、PrivacyInfo.xcprivacy
で宣言した内容と同じになるように、改めて確認・設定をするようにしました。
どうも二重管理してる感が拭えない..
3. 完了後、対応について改善
上記を追えた後、App Storeで審査提出→Reject→再提出...を何度か行い、無事に審査完了しリリースまでこぎつけました。以上でPrivacy Manifests対応は終わりです。お疲れ様でした🍵
ただ、そもそも、「SREの方に言われるまで対応の必要性に気付けなかった」という箇所に課題を感じ、何か対策をしたいなと思いました。
取り急ぎの対応としては、Apple DeveloperのNewsやAndroid DevelopersのブログをSlackのRSSに登録し、(今回のような)アプリ開発の最新状況をキャッチできるようにしています👇
RSSを登録するぞ的な話をしたSlack
この通知のおかげで、「iOS 18対応せなアカンな」「新しいXcodeのバージョンでビルドできるようにしないと...」などのテーマを、チームで取り上げる機会を早めに作ることができました。
このあたりはアプリ開発の知見がチームにまだ溜まっておらず、もっと良いやり方があるかもしれません。「しょうがないな...。オレが教えてやるよ」と思った方、ぜひカジュアルトークしましょう 💬
Discussion