Hướng dẫn khai App Privacy + Age Rating
1. Khi nào dùng tài liệu này
Flow chuẩn là Claude tự mở ASC web qua Playwright MCP và tick checkbox giúp. Nhưng bước đó cần đăng nhập ASC + 2FA bằng người thật trong cửa sổ Chromium. Nếu không login được (2FA không nhận, cửa sổ đóng, PO bận…), PO có thể tự khai tay theo các bước dưới đây — kết quả y hệt.
2. Mở trang App Privacy trên ASC
https://appstoreconnect.apple.com/apps/6780491111/distribution/privacy(hoặc: My Apps → House AI → tab App Privacy ở sidebar trái, dưới mục General.)
3. Bước A — "Do you or your third-party partners collect data from this app?"
Chọn Yes, we collect data from this app.
4. Bảng data types cần khai cho House AI
Apple chia thành các data type. Với mỗi loại được tick, ASC hỏi tiếp 3 câu: Linked to identity? / Used for tracking? / Purposes?. Dưới đây là cấu hình đúng cho House AI:
| Nhóm → Data type | Tick? | Linked to user | Used for tracking | Purpose(s) |
|---|---|---|---|---|
| Identifiers → Device ID (IDFA/IDFV) | ✓ Yes | Yes | Yes | Third-Party Advertising; Analytics |
| Usage Data → Product Interaction | ✓ Yes | Yes | Yes | Analytics; Third-Party Advertising |
| Usage Data → Advertising Data | ✓ Yes | Yes | Yes | Third-Party Advertising |
| User Content → Photos or Videos | ✓ Yes | No | No | App Functionality |
| Diagnostics → Crash / Performance | ✗ Bỏ | — | — | — (không có Crashlytics) |
| Location | ✗ Bỏ | — | — | — (không có CLLocationManager) |
| Contact Info / Name / Email | ✗ Bỏ | — | — | — (app không có form đăng nhập) |
5. Khai từng nhóm data (chi tiết click)
5.1 Identifiers → Device ID
- Ở màn chọn data types, mục Identifiers, tick Device ID.
- Bấm Save → ASC hỏi tiếp cho Device ID:
- Is this data linked to the user's identity? → Yes (IDFA dùng để target ads cá nhân hoá).
- Do you use this data for tracking? → Yes (app gọi
ATTrackingManager.requestTrackingAuthorization). - Purposes → tick Third-Party Advertising + Analytics.
5.2 Usage Data → Product Interaction + Advertising Data
- Mục Usage Data, tick Product Interaction và Advertising Data.
- Cả hai → Linked? Yes · Tracking? Yes.
- Purposes:
- Product Interaction → Analytics + Third-Party Advertising (Firebase logEvent + Facebook/TikTok/Adjust events).
- Advertising Data → Third-Party Advertising (impression/click/revenue ad).
5.3 User Content → Photos or Videos
- Mục User Content, tick Photos or Videos.
- Linked? → No (ảnh phòng không gắn danh tính user).
- Used for tracking? → No.
- Purposes → chỉ App Functionality (ảnh upload lên backend Modal để AI redesign phòng).
6. Used for Tracking = Yes (vì có ATT)
House AI hiển thị App Tracking Transparency prompt (NSUserTrackingUsageDescription có trong Info.plist) và truyền IDFA cho mạng quảng cáo + MMP (Adjust). Theo định nghĩa của Apple, đây là tracking. Vì vậy:
- IDFA (Device ID): Tracking = Yes.
- Usage Data (Product Interaction + Advertising Data): Tracking = Yes.
- Photos: Tracking = No.
ASC sẽ tự gom các data type có Tracking=Yes vào mục "Data Used to Track You" trên trang nutrition label — đây là kết quả đúng và mong muốn.
7. Publish App Privacy
8. Age Rating (4+)
House AI là công cụ thiết kế phòng — không bạo lực / sex / cờ bạc / chất kích thích. Mặc định EXO: 4+.
https://appstoreconnect.apple.com/apps/6780491111/distribution/ageRating (hoặc tab Age Rating trong App Information).9. Bằng chứng từ source code (đối chiếu nếu cần)
Cấu hình ở §4 được suy ra từ việc quét repo house-ai-ios:
| Khai gì | Bằng chứng trong code |
|---|---|
| IDFA + Tracking | Sources/Ads/ATTManager.swift (requestTrackingAuthorization), ConsentManager.swift (UMP), Info.plist NSUserTrackingUsageDescription |
| Usage Data → Analytics + Ads | Sources/Ads/Tracking/PaidImpressionLogger.swift — Firebase Analytics.logEvent, Facebook AppEvents.logPurchase, TikTok trackTTEvent, Adjust trackAdRevenue |
| Advertising Data | AdMob Google-Mobile-Ads-SDK + mediation (Meta/Mintegral/AppLovin) trong Podfile |
| Photos / Camera | Sources/Components/ImagePickers.swift (PHPicker + UIImagePickerController), upload tới house-ai-web.modal.run trong DesignService.swift; Info.plist NSPhotoLibraryUsageDescription, NSCameraUsageDescription |
| KHÔNG Crashlytics | Không tìm thấy import FirebaseCrashlytics |
| KHÔNG Location | Không có CLLocationManager |
| KHÔNG Contacts | Không có CNContactStore / form email-name |
10. Gotchas & lưu ý
- IDFA bắt buộc khai tracking: chỉ cần app gọi ATT prompt và truyền IDFA cho ad network là phải khai Tracking=Yes — kể cả khi user bấm "Ask App Not to Track" (vì khả năng tracking vẫn tồn tại trong code).
- PrivacyInfo.xcprivacy lệch: file manifest trong code đang để
NSPrivacyTracking=falsevàNSPrivacyCollectedDataTypesrỗng, trong khi app thực tế có tracking. Đây là khai báo cấp build (khác với App Privacy trên ASC) — nên sửa cho bản sau để khớp, nhưng KHÔNG chặn submit v1.2 hiện tại. - Photos = User Content, không phải Sensitive: ảnh phòng là nội dung do user chủ động cung cấp cho chức năng chính → App Functionality, Linked=No.
- Sửa được trước approve: nếu lỡ tick sai, vào lại trang App Privacy sửa rồi Publish lại — không cần build mới.
- Sau khi xong: quay lại tab Status trong CodePanel hoặc nói Claude tiếp tục — preflight đã pass 7/7, chỉ chờ Privacy + Age Rating là submit được v1.2 (releaseType MANUAL).