隱私與聲明 是做什麼的?
目的
在兩個商店中提供真實且一致的隱私答案,並以程式碼中的證據為後盾。大多數隱私拒絕的原因是不一致:政策說一套,應用程式做另一套,表單又說第三套。
先決條件
- 原始碼存取權限(應用程式和後端)以及鎖定檔案(
pubspec.lock、Podfile.lock、Gradle 依賴項、package.json)。 - 目前的隱私權政策和條款。
- 了解每個接收使用者資料的後端端點和第三方服務。
1. 建立資料庫存(從程式碼,而非記憶)
在 repo 根目錄執行 scripts/scan-sdks.mjs。它會從鎖定檔案列出已知的 SDK 及其通常觸及的資料類別,並搜尋必要理由 API 使用、權限字串、廣告 ID 和追蹤 API。然後透過讀取網路層和後端來補全庫存:
| 資料 | 來源(畫面 / SDK) | 是否傳送離裝置?傳送給誰? | 是否連結到使用者? | 用途 | 保留期限 | 是否選用? |
|---|
規則:
- 「僅在裝置上處理」表示從未傳送,包括傳送到您自己的伺服器。如果同步到您的後端,則視為已收集。
- 您的處理者(代管服務、依照您的指示運作的 AI 提供者、支付 SDK)仍視為「已收集」;它們是否算作「已分享」因商店而異(見下文)。
- 匿名當機報告和使用次數仍視為已收集(診斷 / 使用資料),通常「未連結」。
將庫存儲存為 docs/privacy-inventory.md。下面的每個答案都引用一個列。
2. Apple App 隱私(App Store Connect › App 隱私)
- 將每個庫存列對應到 Apple 的類別(聯絡資訊、健康與健身、使用者內容、識別碼、購買項目、使用資料、診斷…)、用途、已連結與未連結,以及追蹤。
- 追蹤 = 將您的資料與第三方資料連結以進行目標廣告或廣告衡量,或與資料經紀人分享。沒有廣告 SDK 且沒有資料經紀人通常表示「無追蹤」且無 ATT 提示。
- 選擇性揭露僅在全部滿足 Apple 條件時適用(不頻繁、選用、每次由使用者發起、非追蹤/廣告)。很少適用於應用程式功能。
- 文件:App 隱私詳細資訊。
3. Google Play 資料安全(政策 › 應用程式內容 › 資料安全)
- 相同的庫存,Play 的分類(個人資訊、健康與健身、照片與影片、訊息、應用程式活動、應用程式資訊與效能、裝置或其他 ID、財務資訊…)。
- 分享排除代表您處理資料的服務提供者傳輸;建立跨客戶廣告輪廓的 SDK 則屬於分享。
- 短暫:僅在記憶體中處理,不儲存,僅用於即時請求(例如,分析後即丟棄的照片)。
- 使用匯出為 CSV / 從 CSV 匯入:將 CSV 保存在 repo 中(
store/data-safety.csv),以便像程式碼一樣審查變更。匯入會覆蓋所有答案。 - 文件:資料安全。
4. 其他 Play 聲明
- 健康應用程式聲明:每個應用程式都必須完成,即使沒有健康功能。文件。
- Health Connect:每個權限一個理由;僅請求可見功能使用的權限;一個理由活動 (
ACTION_SHOW_PERMISSIONS_RATIONALE) 連結到政策。Play 可能會要求該流程的螢幕錄影。 - 廣告 ID:聲明是否使用。如果沒有廣告/歸因 SDK,請聲明「否」,並確保沒有依賴項目添加
com.google.android.gms.permission.AD_ID(檢查合併後資訊清單;如果已添加,使用tools:node="remove"移除)。 - 目標對象、內容分級 (IARC)、廣告、應用程式存取權、新聞、金融功能、政府:從庫存中回答。如果任何部分需要登入,請在應用程式存取權中提供審核者憑證。
- 帳戶刪除:見第 8 節。
5. 隱私清單 (iOS)
- 將
PrivacyInfo.xcprivacy添加到應用程式目標(範本:templates/PrivacyInfo.xcprivacy)。 - 聲明
NSPrivacyTracking、NSPrivacyTrackingDomains、NSPrivacyCollectedDataTypes(與 App 隱私一致)以及應用程式自身程式碼使用的每個必要理由 API 類別的NSPrivacyAccessedAPITypes:檔案時間戳記、系統啟動時間、磁碟空間、活動鍵盤、UserDefaults。從 Apple 的清單中選擇已核准的理由代碼。Flutter 應用程式透過shared_preferences等外掛程式使用 UserDefaults — 檢查每個外掛程式是否附帶自己的清單;添加您的程式碼和沒有清單的外掛程式所使用的部分。 - 建置後,檢查 App Store Connect 電子郵件/建置警告是否有遺失的清單理由。
- 文件:隱私清單檔案,必要理由 API。
6. 出口合規 (iOS)
- Info.plist 中的
ITSAppUsesNonExemptEncryption:當應用程式不使用加密或僅使用豁免加密(例如,透過 OS 的 HTTPS、僅用於保護使用者自身資料的標準演算法,且應用程式的主要功能不是安全性)時,應設定為false。設定此項可跳過每次建置的問題。 - 如果您實作或捆綁專有密碼學,或加密是主要功能,請改為回答問題,並檢查是否需要文件或年度自行分類報告。
- 這是法律分類;如有疑問,請諮詢貿易合規顧問。文件:遵守加密出口法規。
7. 年齡分級
- 如實回答當前的 Apple 問卷和 Play IARC 問卷,包括有關健康/保健主題、AI 聊天或生成內容、使用者生成內容和無限制網頁存取的問題。
- 保持分級與您的條款最低年齡和任何應用程式內年齡門檻一致。如果問卷結果低於您的條款最低年齡,請使用商店的選項設定較高分級,而不是留下不一致。
8. 帳戶刪除
- 應用程式內:如果使用者可以建立帳戶,他們可以在應用程式內開始刪除(帳戶設定)。僅停用是不夠的。訪客/自動建立的帳戶也一樣。允許重新驗證或確認,但不能不必要地困難。Apple:提供帳戶刪除。
- 網址 (Play):一個頁面,無需應用程式或登入即可存取,標明列表中的應用程式名稱,說明如何請求刪除、刪除什麼以及保留什麼(以及原因),以及任何先決步驟(取消訂閱)。文件:Play 帳戶刪除。
- 訂閱:刪除帳戶不會取消商店訂閱。在刪除表單中警告並連結到商店的訂閱管理。
- Sign in with Apple:在刪除時透過 Sign in with Apple REST API 撤銷使用者的令牌。
- 第三方:也在處理者端刪除使用者(例如 RevenueCat 客戶、分析/當機識別碼、電子郵件清單)。
- 重新驗證推出:如果您為刪除端點添加重新驗證要求,請在後端變更的同時發布處理新回應的應用程式,或為舊版應用程式保留舊行為。
- 在所有地方(應用程式、政策、商店表單、網頁)使用相同的路徑用語,例如「個人資料 › 刪除帳戶」。
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 隱私 ↔ 資料安全 CSV ↔ 應用程式內同意文字 ↔ Info.plist 字串。無矛盾。
- 測試:刪除測試帳戶;確認後端列、處理者記錄和驗證使用者已消失;網站刪除頁面在登出狀態下可存取。
- 建置後沒有隱私清單警告。
常見陷阱
- 政策中說「資料從未離開裝置」,但同步或 AI 功能卻傳送資料。
- 在表單中忘記自己的匿名當機/使用情況回報。
- 依賴項目靜默添加 AD_ID 權限。
- 健康資料透過包含「我們所知的一切」的「上下文」建構器流入 AI 提示。
- 刪除路徑在應用程式、政策和商店表單中命名不同。
- 年齡分級為 4+,但條款規定為 16+。