Build iOS Anda ditolak. Perbaiki dan unggah lagi tanpa Mac
Apple mengirim email, atau upload Anda gagal, dan Anda tidak punya Mac. Pertama, periksa apakah perbaikannya memang butuh build baru. Sebagian tidak. Untuk yang butuh, halaman ini memberi perbaikannya dan perintah untuk archive, export dan unggah lagi dalam satu hari.
Apakah ini butuh build baru?
Tidak setiap masalah berarti build ulang. Perbaikan berikut dilakukan di App Store Connect, dari browser apa pun:
- Screenshot, deskripsi, dan teks halaman produk lainnya.
- Jawaban export compliance untuk build yang ditandai Missing Compliance.
- Jawaban App Privacy Anda di App Store Connect.
Perbaikan lain butuh build baru, jadi butuh Xcode di Mac. Ini mencakup Xcode atau SDK yang lama, privacy manifest, string Info.plist, dan perubahan kode atau SDK. Setiap upload baru juga butuh build number yang lebih tinggi.
1. Di-build dengan Xcode yang terlalu lama
Sejak 28 April 2026, Apple hanya menerima upload yang di-build dengan Xcode 26 atau lebih baru, memakai SDK iOS 26. Build dari Xcode 16 gagal memenuhi aturan ini. Untuk melihat apa yang membuat sebuah archive, baca dua key dari aplikasinya:
/usr/libexec/PlistBuddy -c 'Print :DTSDKName' -c 'Print :DTXcode' \ MyApp.xcarchive/Products/Applications/MyApp.app/Info.plist
Di runner macos-26 GitHub perintah ini mencetak iphoneos26.5 dan 2660, yang berarti Xcode 26.6. Mac MacRun punya Xcode 27.1 sebagai default dan juga Xcode 26.6. Keduanya lolos aturan ini.
Satu catatan: Apple bilang aplikasi dengan SDK iOS 27.1 akan butuh screenshot iPhone Duo mulai April 2027. Panduan iPhone Duo kami menunjukkan cara mengambilnya.
2. Privacy manifest dan required reason API
Beberapa API butuh alasan yang dinyatakan, seperti UserDefaults dan timestamp file. Alasannya ditulis di file bernama PrivacyInfo.xcprivacy. Sejak 1 Mei 2024, App Store Connect tidak menerima aplikasi yang melewatkan ini. Apple juga menolak manifest dengan key yang tidak dikenal. Email-nya menyebut path setiap file yang bermasalah.
Ini manifest minimal untuk aplikasi yang membaca UserDefaults miliknya sendiri. CA92.1 adalah kode alasan Apple untuk pemakaian itu:
<?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/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
</dict>
</plist>Tambahkan ke target aplikasi Anda. Lalu periksa apakah file itu valid. Kami menjalankan ini pada file yang benar dan file yang rusak:
$ plutil -lint MyApp/PrivacyInfo.xcprivacy MyApp/PrivacyInfo.xcprivacy: OK $ plutil -lint bad.xcprivacy bad.xcprivacy: (Value missing for key inside <dict> at line 1)
Setelah archive, file itu seharusnya ada di root .app. Punya kami ada di sana. Jika email menyebut SDK pihak ketiga, perbarui SDK itu. Manifest milik SDK itu harus mencakup pemakaian API-nya sendiri.
3. Usage description string yang hilang
Jika aplikasi Anda memakai kamera, foto atau lokasi, Info.plist butuh purpose string untuk itu. Apple bilang akses gagal tanpa string itu, dan aplikasinya mungkin crash. Guideline App Review 5.1.1(ii) juga meminta string itu menjelaskan dengan jelas pemakaian data Anda.
<key>NSCameraUsageDescription</key> <string>Scan receipts to add them to your expenses.</string>
Periksa aplikasi hasil build, bukan hanya file source-nya:
plutil -extract NSCameraUsageDescription raw \ MyApp.xcarchive/Products/Applications/MyApp.app/Info.plist
4. Export compliance
Build tanpa jawaban soal enkripsi menampilkan Missing Compliance di TestFlight. Anda tidak perlu build ulang untuk ini. Buka build di App Store Connect, klik Manage, dan jawab pertanyaannya. Agar lain kali bisa dilewati, tambahkan key ini ke Info.plist. Pakai false hanya jika enkripsi Anda termasuk yang dikecualikan, seperti HTTPS biasa:
<key>ITSAppUsesNonExemptEncryption</key> <false/>
5. Screenshot yang salah atau tidak ada
Screenshot tidak butuh build ulang, tetapi ukurannya harus tepat. Apple mewajibkan setidaknya satu screenshot iPhone dengan ukuran Dynamic Island medium. Itu 1179 x 2556 atau 1206 x 2622 piksel dalam posisi tegak. Tanpa iPhone di tangan, Simulator bisa membuatnya:
xcrun simctl boot "iPhone 17 Pro" xcrun simctl install "iPhone 17 Pro" MyApp.app xcrun simctl launch "iPhone 17 Pro" com.example.myapp xcrun simctl io "iPhone 17 Pro" screenshot shot.png sips -g pixelWidth -g pixelHeight shot.png
Screenshot iPhone 17 Pro kami keluar dengan ukuran 1206 x 2622, ukuran yang diwajibkan. iPhone 17 Pro Max memberi 1320 x 2868, yang cocok untuk set besar. Jalankan xcrun simctl list devices available untuk melihat apa yang terpasang.
Build ulang dan unggah
Naikkan build number, lalu buat archive. Di runner test kami langkah ini memakan waktu 12 detik untuk aplikasi SwiftUI kecil:
xcodebuild archive -project MyApp.xcodeproj -scheme MyApp \ -destination 'generic/platform=iOS' \ -archivePath build/MyApp.xcarchive \ MARKETING_VERSION=1.0.1 CURRENT_PROJECT_VERSION=3
Berikutnya, export .ipa yang sudah ditandatangani. Taruh ini di ExportOptions.plist, dengan Team ID Anda sendiri. Key-nya diambil dari xcodebuild -help:
<?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>method</key> <string>app-store-connect</string> <key>teamID</key> <string>ABCDE12345</string> <key>signingStyle</key> <string>automatic</string> </dict> </plist>
xcodebuild -exportArchive -archivePath build/MyApp.xcarchive \ -exportOptionsPlist ExportOptions.plist -exportPath build/export \ -allowProvisioningUpdates
Masuk ke Xcode dengan Apple Account Anda lebih dulu. Archive test kami yang tanpa signing tidak punya tim, dan export berhenti dengan "error: exportArchive No Team Found in Archive".
Halaman upload Apple mencantumkan Xcode, Transporter dan altool. Dengan altool, simpan app-specific password di keychain sekali. Lalu validasi dan unggah:
xcrun altool --store-password-in-keychain-item altool -u you@example.com -p xxxx-xxxx-xxxx-xxxx xcrun altool --validate-app -f build/export/MyApp.ipa -t ios -u you@example.com -p @keychain:altool xcrun altool --upload-app -f build/export/MyApp.ipa -t ios -u you@example.com -p @keychain:altool
Atau atur destination ke upload di ExportOptions.plist. Lalu -exportArchive mengirim build ke App Store Connect sendiri. Panduan publish kami membahas API key dan TestFlight.
Perbaiki dalam satu hari
Pass harian MacRun seharga $15, bayar sekali tanpa perpanjangan. Ini Mac mini M6 khusus, siap dalam waktu kurang dari 5 menit. Xcode 27.1 dan Xcode 26.6 sudah terpasang, dengan simulator iOS 27.1. Anda menjangkaunya lewat Tailscale dengan SSH atau viewer VNC. Jika review mengembalikannya lagi, seminggu seharga $59. Mac dihapus di akhir masa sewa, jadi push kode Anda lebih dulu.
Siapa yang sebaiknya tidak menyewa Mac untuk ini
- Jika perbaikannya berupa screenshot, teks atau jawaban export, pakai App Store Connect di browser.
- Aplikasi Expo bisa build ulang dengan EAS Build di mesin macOS milik Expo. Lihat build aplikasi iOS di Windows.
- Jika Anda sudah build di Codemagic atau GitHub Actions, push perbaikannya dan biarkan CI build ulang.
Pertanyaan yang sering diajukan
Bisakah saya memperbaiki penolakan App Store tanpa Mac?
+
Kadang bisa. Screenshot, teks dan jawaban export compliance diperbaiki di App Store Connect dari browser apa pun. Xcode baru, privacy manifest atau perubahan Info.plist butuh build baru, dan itu butuh macOS.
Versi Xcode mana yang diwajibkan App Store Connect pada 2026?
+
Sejak 28 April 2026, Apple mewajibkan upload yang di-build dengan Xcode 26 atau lebih baru, memakai SDK iOS 26. Mac MacRun punya Xcode 27.1 sebagai default dan Xcode 26.6 juga terpasang.
Bagaimana cara menambahkan privacy manifest ke aplikasi iOS saya?
+
Tambahkan file bernama PrivacyInfo.xcprivacy ke target aplikasi Anda. Cantumkan setiap kategori required reason API dengan kode alasan Apple, seperti CA92.1 untuk UserDefaults milik aplikasi sendiri. Periksa dengan plutil -lint, lalu build ulang.
Build TestFlight saya bilang Missing Compliance. Apakah saya perlu build ulang?
+
Tidak. Buka build di App Store Connect, klik Manage, dan jawab pertanyaan soal enkripsi. Tambahkan ITSAppUsesNonExemptEncryption ke Info.plist di build berikutnya agar pertanyaan itu terlewati.
Ukuran screenshot berapa yang diwajibkan App Store untuk iPhone?
+
Apple mewajibkan setidaknya satu screenshot untuk iPhone dengan Dynamic Island, layar medium: 1179 x 2556 atau 1206 x 2622 piksel dalam posisi tegak. Screenshot dari simulator iPhone 17 Pro kami berukuran 1206 x 2622.
Bagaimana cara mengunggah build baru tanpa jendela Xcode?
+
Export .ipa dengan xcodebuild -exportArchive, lalu jalankan xcrun altool --upload-app. Transporter juga bisa. Apple mencantumkan keduanya di halaman upload-nya.