プライバシーと宣言
目的
両ストアで真実で一貫性のあるプライバシー回答を、コードからの証拠に基づいて提供します。プライバシー関連の却下のほとんどは不整合が原因です。ポリシーが一つのことを言い、アプリが別のことをし、フォームがさらに別のことを言っています。
前提条件
- ソースコードへのアクセス(アプリとバックエンド)およびロックファイル(
pubspec.lock、Podfile.lock、Gradle依存関係、package.json)。 - 現在のプライバシーポリシーと利用規約。
- ユーザーデータを受け取るすべてのバックエンドエンドポイントとサードパーティサービスの把握。
1. データインベントリの構築(記憶ではなくコードから)
リポジトリルートで scripts/scan-sdks.mjs を実行します。これはロックファイルから既知のSDKとそれらが通常扱うデータカテゴリをリストアップし、必須理由APIの使用、パーミッション文字列、広告IDおよびトラッキングAPIをgrepします。その後、ネットワークレイヤーとバックエンドを読み込んでインベントリを完成させます。
| データ | ソース(画面/SDK) | デバイス外に送信?誰に? | ユーザーにリンク? | 目的 | 保持期間 | オプション? |
|---|
ルール:
- 「デバイス上でのみ処理」とは、自社サーバーを含め、決して送信されないことを意味します。バックエンドに同期される場合は収集されます。
- プロセッサ(ホスティング、指示に従って行動するAIプロバイダ、決済SDK)への送信も「収集」に該当します。これが「共有」とみなされるかどうかはストアによって異なります(以下を参照)。
- 匿名のクラッシュレポートと使用回数も収集され(診断データ/使用状況データ)、通常は「リンクなし」です。
インベントリを docs/privacy-inventory.md として保存します。以下のすべての回答はインベントリの行を引用します。
2. Apple App Privacy(App Store Connect › App Privacy)
- インベントリの各行をAppleのカテゴリ(連絡先情報、健康とフィットネス、ユーザーコンテンツ、識別子、購入、使用状況データ、診断データ…)、目的、リンクあり vs リンクなし、トラッキングにマッピングします。
- トラッキングとは、ターゲット広告や広告測定のためにデータを第三者データとリンクすること、またはデータブローカーと共有することです。広告SDKやデータブローカーがなければ、通常は「トラッキングなし」であり、ATTプロンプトは不要です。
- オプション開示は、Appleの条件をすべて満たす場合にのみ適用されます(頻度が少ない、オプション、ユーザーが毎回開始、トラッキング/広告ではない)。アプリの機能にはほとんど適用されません。
- ドキュメント:App privacy details。
3. Google Play データセーフティ(ポリシー › アプリコンテンツ › データセーフティ)
- 同じインベントリをPlayの分類(個人情報、健康とフィットネス、写真と動画、メッセージ、アプリのアクティビティ、アプリの情報とパフォーマンス、デバイスまたはその他のID、財務情報…)にマッピングします。
- 共有は、代理で処理するサービスプロバイダへの転送を除外します。クロスカスタマー広告プロファイルを構築するSDKは共有に該当します。
- 一時的:メモリ内でのみ処理され、保存されず、リアルタイムのリクエストのためだけに使用されます(例:分析後破棄される写真)。
- CSVへのエクスポート / CSVからのインポートを使用します。CSVをリポジトリ(
store/data-safety.csv)に保持することで、変更はコードと同様にレビューされます。インポートはすべての回答を上書きします。 - ドキュメント:Data safety。
4. その他のPlay宣言
- ヘルスケアアプリ宣言:すべてのアプリが完了する必要があります。ヘルス機能がない場合でも同様です。ドキュメント。
- Health Connect:パーミッションごとに1つの正当化が必要です。可視機能が使用するパーミッションのみをリクエストします。ポリシーにリンクする理由説明アクティビティ(
ACTION_SHOW_PERMISSIONS_RATIONALE)が必要です。Playからフローのスクリーンレコーディングを求められる場合があります。 - 広告識別子:使用するかどうかを宣言します。広告/アトリビューションSDKがない場合は「いいえ」と宣言し、依存関係が
com.google.android.gms.permission.AD_IDを追加していないことを確認します(マージされたマニフェストを確認し、追加されている場合はtools:node="remove"で削除します)。 - ターゲットオーディエンス、コンテンツレーティング(IARC)、広告、アプリアクセス、ニュース、金融機能、政府:インベントリから回答します。一部がログインの背後にある場合は、アプリアクセスにレビュー担当者の認証情報を提供します。
- アカウント削除:セクション8を参照してください。
5. プライバシーマニフェスト(iOS)
PrivacyInfo.xcprivacyをアプリターゲットに追加します(テンプレート:templates/PrivacyInfo.xcprivacy)。NSPrivacyTracking、NSPrivacyTrackingDomains、NSPrivacyCollectedDataTypes(App Privacyと一致)および、アプリの独自コードが使用する必須理由APIのカテゴリごとにNSPrivacyAccessedAPITypesを宣言します:ファイルタイムスタンプ、システム起動時間、ディスク容量、アクティブなキーボード、UserDefaults。Appleのリストから承認された理由コードを選択します。Flutterアプリはshared_preferencesなどのプラグインを介してUserDefaultsを使用します。各プラグインが独自のマニフェストを提供しているか確認し、独自コードとマニフェストがないプラグインが使用するものを追加します。- ビルド後、App Store Connectのメール / ビルド警告で不足しているマニフェスト理由がないか確認します。
- ドキュメント:Privacy manifest files、Required reason API。
6. 輸出コンプライアンス(iOS)
- Info.plistの
ITSAppUsesNonExemptEncryption:暗号化を使用しないか、免除される暗号化のみを使用する場合(例:OS経由のHTTPS、アプリの主機能がセキュリティではないアプリでユーザーのデータを保護するためだけに使用される標準アルゴリズム)はfalseが適切です。これを設定すると、ビルドごとの質問がスキップされます。 - 独自の暗号化を実装またはバンドルする場合、または暗号化が主要機能である場合は、代わりに質問に回答し、文書化または年次の自己分類レポートが必要かどうかを確認します。
- これは法的な分類です。不明な場合は、貿易コンプライアンスアドバイザーに相談してください。ドキュメント:Complying with encryption export regulations。
7. 年齢評価
- 現在のAppleの質問票とPlayのIARC質問票に正直に回答します。健康/ウェルネストピック、AIチャットまたは生成コンテンツ、ユーザー生成コンテンツ、制限のないWebアクセスに関する質問を含みます。
- レーティングを利用規約の最低年齢およびアプリ内の年齢ゲートと一致させます。質問票の結果が利用規約の最低年齢よりも低い場合は、不一致を残さずにストアのオプションを使用してより高いレーティングを設定します。
8. アカウント削除
- アプリ内:ユーザーがアカウントを作成できる場合は、アプリ内(アカウント設定)で削除を開始できるようにします。無効化だけでは十分ではありません。ゲスト/自動生成アカウントも同様です。再認証または確認は許可されていますが、不必要に難しいものであってはなりません。Apple:Offering account deletion。
- Web URL(Play):アプリやログインなしでアクセス可能なページで、リスト上のアプリ名を記載し、削除リクエスト方法、削除されるものと保持されるもの(およびその理由)、および事前の手順(サブスクリプションのキャンセルなど)を説明します。ドキュメント:Play account deletion。
- サブスクリプション:アカウントを削除してもストアのサブスクリプションはキャンセルされません。削除シートで警告し、ストアのサブスクリプション管理にリンクします。
- Sign in with Apple:削除時にSign in with Apple REST APIを介してユーザーのトークンを無効にします。
- サードパーティ:プロセッサでもユーザーを削除します(例:RevenueCatの顧客、分析/クラッシュ識別子、メーリングリスト)。
- 再認証の展開:削除エンドポイントに再認証要件を追加する場合は、バックエンドの変更と同時に新しい応答を処理するアプリをリリースするか、古いアプリバージョンでは以前の動作を維持します。
- パス(アプリ、ポリシー、ストアフォーム、Webページ)では同じ表現を使用します。例:「プロフィール › アカウントを削除」。
9. AI機能
- Apple 5.1.2(i):個人データが第三者(第三者AIを含む)と共有される場所を開示し、事前に明示的な許可を得ます。
- AI機能の初回使用前:プロバイダと役割を記載した短い同意シート(「回答を生成するために <AIプロバイダ> が処理します」)、送信される内容、モデルのトレーニングに使用されないこと(プロバイダの利用規約が該当するプランでそう述べている場合のみ)、保持期間(プロバイダと自社の両方)を表示します。設定に取り消し用のスイッチを設けます。
- ポリシーの文言:AIプロバイダはあなたの指示に従って行動するプロセッサ/サービスプロバイダとして機能します。所在地と保持期間とともにリストします。
- ストアフォーム:AIへの入力(メッセージ、写真、テキスト)は収集データ(ユーザーコンテンツ)です。プロバイダがプロセッサである場合、通常Playでは「共有」されません。
- 考慮事項:健康や金融に関するAI回答には「専門的なアドバイスではありません」という一文を追加し、危機的なトピックに対する定義された安全な応答を用意します。
10. ヘルスデータ
- HealthKit / Health ConnectのデータをAIプロバイダやその他の第三者に決して送信しないでください。 Apple(5.1.3)はヘルスデータの使用と開示を制限しています。Health Connectのポリシーも転送を制限しています。最もシンプルな準拠設計:Apple Health / Health Connectから読み取られたデータはデバイス上に留まるか(または開示されたユーザー自身のアカウントストレージのみに保存され)、AIを呼び出す機能はユーザーがアプリに入力したデータのみを使用します。
- ヘルスデータを広告やマーケティングに使用しないでください。iCloudに保存しないでください。
- Info.plistの使用文字列(
NSHealthShareUsageDescription、NSHealthUpdateUsageDescription)は実際の使用を述べなければなりません。文字列が「第三者と共有されることはありません」と述べている場合、コードはそれを保証しなければなりません。 - コードで強制します:AI呼び出しのリクエストビルダーは明示的な許可リストのフィールドを受け取り、ヘルスソースのフィールドがAIペイロードに現れた場合に失敗するテストを追加します。
人間の承認が必要な判断ポイント
すべてのフォームの最終回答(アカウント所有者が法的責任を負います)、輸出コンプライアンス分類、年齢評価、AIプロバイダとそのデータ利用規約、デバイスから送信されるヘルスデータの変更。
検証
- すべてのフォーム回答はインベントリの行を引用し、インベントリはコードを引用します。
- 差分チェック:プライバシーポリシー ↔ App Privacy ↔ データセーフティCSV ↔ アプリ内同意テキスト ↔ Info.plist文字列。矛盾がないことを確認します。
- テスト:テストアカウントを削除し、バックエンドの行、プロセッサのレコード、認証ユーザーが削除されていることを確認します。Web削除ページがログアウト状態でアクセス可能であることを確認します。
- ビルドにプライバシーマニフェストの警告が表示されないことを確認します。
よくある落とし穴
- 同期やAI機能がデータを送信しているにもかかわらず、ポリシーで「データがデバイスから送信されることはありません」と述べている。
- 自社の匿名クラッシュ/使用状況レポートをフォームに記載し忘れる。
- 依存関係が静かにAD_IDパーミッションを追加する。
- 「私たちが知っているすべて」を含む「コンテキスト」ビルダーを通じてヘルスデータがAIプロンプトに流れ込む。
- 削除パスの名前がアプリ、ポリシー、ストアフォームで異なっている。
- 年齢評価が4+である一方、利用規約が16+と述べている。