Memahami persyaratan publikasi di App Store & Play Store: aset store (screenshot, deskripsi, icon), privacy manifest, data safety form, alasan umum penolakan, dan checklist submission lengkap untuk kedua platform.

Setelah di episode 18 dan 19 kita build dan distribusikan ke TestFlight & Play Console internal testing, pada episode ini kita masuk ke publikasi store: langkah terakhir sebelum aplikasi bisa di-download oleh user di seluruh dunia. Kedua store (App Store & Play Store) memiliki persyaratan ketat yang harus dipenuhi, dan memahami review guidelines akan menghemat waktu penolakan yang frustasi.
| Aset | Spesifikasi |
|---|---|
| App Icon | 1024x1024 px, PNG, tanpa transparansi |
| Screenshots | 6.7" (iPhone 15 Pro Max), 6.1" (iPhone 15), 5.5" (iPhone SE) |
| App Preview Video | Max 30 detik, bisa di-skip |
| App Name | Max 30 karakter |
| Subtitle | Max 30 karakter |
| Description | Max 4000 karakter |
| Keywords | Max 100 karakter, koma-separated |
| Privacy Policy URL | Wajib |
| Aset | Spesifikasi |
|---|---|
| App Icon | 512x512 px, PNG |
| Feature Graphic | 1024x500 px |
| Screenshots | Min 2, max 8; 16:9 atau 9:16 |
| App Name | Max 30 karakter |
| Short Description | Max 80 karakter |
| Full Description | Max 4000 karakter |
| Privacy Policy URL | Wajib |
Apple mewajibkan privacy manifest untuk mendeklarasikan penggunaan API yang dianggap "required reason":
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeLocation</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
</array>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
</array>
</dict>
</plist>Google Play mengharuskan mengisi data safety section yang menjelaskan data apa yang dikumpulkan aplikasi, bagaimana digunakan, dan apakah dibagikan ke pihak ketiga. Isi dengan jujur — ini ditampilkan ke user sebelum install.
| Alasan | Solusi |
|---|---|
| Crash atau bug | Test menyeluruh sebelum submit |
| Incomplete metadata | Lengkapi semua field, screenshot harus relevan |
| Privacy policy tidak jelas | Buat privacy policy yang detail dan mudah diakses |
| Fitur placeholder/broken | Hapus fitur yang belum jalan |
| Guideline 4.2 - Design minimum | Tambahkan value yang jelas, bukan wrapper website |
| Permission tidak dijustifikasi | Beri penjelasan di Info.plist yang jelas |
| Alasan | Solusi |
|---|---|
| Malware/SPAM | Hindari kode mencurigakan, berikan value jelas |
| intellectual property violation | Gunakan konten original |
| Misleading description | Deskripsi harus match dengan fungsi aplikasi |
| Data safety tidak lengkap | Isi form dengan benar dan lengkap |
| Pelanggaran kebijakan konten | Ikuti content policy Google |
Important
Sediakan akun demo atau test account untuk reviewer. Jika aplikasi membutuhkan login, masukkan kredensial demo di "Demo Account" saat submit. Tanpa ini, reviewer tidak bisa mengevaluasi aplikasi dan akan menolaknya.
Inti yang harus dibawa pulang:
Di episode 21 selanjutnya, kita akan membahas CI/CD untuk NativePHP — pipeline GitHub Actions untuk build iOS (macOS runner) & Android, otomasi Fastlane untuk signing dan upload, serta versioning otomatis dari git tag. Sampai jumpa di episode 21!