Jalur yang Mengirim Build ke App Store
Di Bagian 1 kita membuat build target MAS, dan di Bagian 2 kita membuat file konfigurasi dan percabangan kode yang memisahkan dua saluran. Target FocusTimer MAS kini dalam bentuk yang dapat dimasukkan ke App Store.
Dalam bagian terakhir ini, kita akan menyiapkan jalur untuk mengunggah build tersebut ke App Store Connect, dan membahas cara memverifikasi dua saluran agar tetap tidak rusak ke depannya, menyelesaikan seri.
Seperti di Bagian 1 dan 2,
FocusTimer,com.example.FocusTimer.mas, Team IDABCDE12345, dan sebagainya semuanya adalah nilai contoh.
Langkah 1 — ExportOptions-MAS.plist untuk Upload
Dalam seri distribusi langsung, kita mencatat bahwa saat mengekspor arsip untuk distribusi, perintah xcodebuild -exportArchive membaca sebuah ExportOptions.plist. Saluran MAS memerlukan file konfigurasi ekspor yang terpisah.
Buat ExportOptions-MAS.plist di direktori rilis proyek.
<?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</string>
<key>destination</key>
<string>upload</string>
<key>signingStyle</key>
<string>automatic</string>
<key>teamID</key>
<string>ABCDE12345</string>
</dict>
</plist>
Inilah arti setiap kunci.
method=app-store— Berarti build ini diekspor untuk saluran Mac App Store. Ini berbeda dengandeveloper-idsaluran distribusi langsung.destination=upload— Membuatxcodebuild -exportArchivemengunggah artefak yang diekspor langsung ke App Store Connect. Tidak perlu lagi melalui Transporter atau alat upload terpisah seperti di masa lalu.signingStyle=automatic— Xcode secara otomatis mencocokkan profil provisioning Mac App Store dan sertifikat Apple Distribution.teamID— Team ID Apple Developer Anda.
Setelah Anda membuat file ini, gunakan kembali untuk setiap rilis MAS. Biarkan ExportOptions.plist distribusi langsung apa adanya, dan simpan file ini berdampingan dengannya.
Langkah 2 — Daftarkan Catatan Aplikasi di App Store Connect
Untuk benar-benar mengirimkan aplikasi untuk review, harus ada catatan (record) aplikasi di App Store Connect. Catatan adalah wadah yang menyimpan semua informasi yang ditampilkan di store — nama aplikasi, deskripsi, screenshot, harga, dan sebagainya.
Membuat catatan bisa menunggu sampai tepat sebelum pengiriman pertama yang sebenarnya. Pada tahap konfigurasi satu kali, cukup mengetahui terlebih dahulu “item mana yang harus diputuskan dan bagaimana caranya.” Secara khusus, Primary Language di bawah ini sulit untuk diubah setelah ditetapkan, jadi putuskan dengan hati-hati terlebih dahulu.
Di App Store Connect → My Apps → + → New App, masukkan hal-hal berikut.
- Platform — Pilih macOS
- Primary Language — ⚠️ Item yang paling hati-hati diputuskan. Setelah ditetapkan, sangat sulit untuk diubah melalui self-service. Jika Anda berencana merilis aplikasi di beberapa negara, umum untuk menetapkan English (U.S.) sebagai bahasa utama, karena bahasa utama adalah “bahasa dasar yang ditampilkan saat tidak ada terjemahan untuk negara tertentu.”
- App Name — Nama dalam bahasa utama (misalnya,
FocusTimer). Nama untuk bahasa lain ditambahkan nanti secara terpisah sebagai lokalisasi per-bahasa. Misalnya, Anda dapat membuat pengguna Korea melihat nama Korea dan pengguna Jepang melihat nama Jepang. - Bundle ID — Pilih
com.example.FocusTimer.masdari dropdown. Itu adalah ID yang Anda daftarkan di Bagian 1. Jangan bingungkan dengan Bundle ID distribusi langsung (com.example.FocusTimer) — ini harus yang dengan.masditambahkan. - SKU — String pengenal internal yang hanya Anda gunakan. Ini tidak terekspos di store, jadi Anda dapat memilihnya dengan bebas (misalnya,
focustimer-mas-001).
Kategori aplikasi harus cocok dengan nilai yang Anda masukkan di
LSApplicationCategoryTypediInfo.plistdi Bagian 2. Jika Anda memasukkanpublic.app-category.productivity(Produktivitas) di plist, Anda juga harus memilih kategori “Produktivitas” di App Store Connect agar peringatan ketidakcocokan tidak muncul selama review.
Langkah 3 — Memverifikasi Build Kedua Saluran
Anda sekarang memiliki satu codebase dengan dua build target. Ini datang dengan biaya pemeliharaan. Jika Anda biasanya hanya mem-build saluran distribusi langsung, Anda tidak akan menyadari jika target MAS diam-diam rusak. Misalnya, Anda menambahkan kode baru tetapi lupa percabangan #if canImport(Sparkle), dan hanya build MAS yang gagal dikompilasi.
Cara paling andal untuk mencegah ini adalah mengarsipkan target MAS juga setiap kali Anda membuat rilis distribusi langsung. Jika build berhasil, berarti percabangan dua saluran masih utuh.
xcodebuild -project FocusTimer.xcodeproj -scheme "FocusTimer MAS" \
-configuration Release \
-destination 'platform=macOS' \
-archivePath build/FocusTimer-MAS.xcarchive \
archive
Jika Anda melihat hal berikut di akhir output, percabangan MAS baik-baik saja.
** ARCHIVE SUCCEEDED **
Saya menyarankan untuk memasukkan perintah ini ke langkah terakhir skrip otomatisasi rilis Anda sehingga berjalan secara otomatis di setiap rilis. Bahkan saat Anda tidak benar-benar mengunggah build MAS ke App Store, hanya mengonfirmasi bahwa arsip berhasil sudah cukup untuk menjamin bahwa percabangan dua saluran tidak rusak.
Rangkuman Seri — Konfigurasi Satu Kali Rilis MAS Selesai
Konfigurasi satu kali tiga bagian untuk merilis ke Mac App Store kini selesai sepenuhnya. Anda sekarang memiliki:
- ✅ (Bagian 1) Bundle ID khusus MAS + build target
FocusTimer MASyang diduplikasi - ✅ (Bagian 2) Entitlement dan Info.plist khusus MAS + pengaturan build + percabangan kode
#if canImport(Sparkle) - ✅ (Bagian 3)
ExportOptions-MAS.plistuntuk upload + cara mendaftarkan catatan App Store Connect + verifikasi build kedua saluran
Dengan ini, satu aplikasi macOS kini memiliki kedua saluran distribusi langsung (Developer ID) dan Mac App Store. Untuk menyatakan ulang struktur inti:
- Berbagi codebase yang sama, tetapi membaginya menjadi dua build target.
- Target distribusi langsung menyertakan Sparkle, dan target MAS mengecualikannya.
- Perbedaan antara keduanya diekspresikan melalui file entitlement, Info.plist, dan ExportOptions yang terpisah dan percabangan kode
#if canImport(Sparkle).
Pengaturan awal memerlukan cukup banyak usaha, tetapi ini juga merupakan struktur yang terus digunakan kembali setelah tersedia. Mulai sekarang, saat Anda membuat rilis distribusi langsung, Anda hanya perlu mengarsipkan build MAS bersamanya dan mengonfirmasi bahwa percabangannya masih hidup. Pengiriman App Store yang sebenarnya (screenshot, deskripsi, menangani review) adalah pekerjaan terpisah yang dilakukan di atas konfigurasi satu kali ini, dan itu adalah topik untuk artikel lain.