Fitur perakitan dan pengiriman aplikasi iOS

Dalam artikel ini, Maxim Shestakov, Insinyur DevOps di studio Plarium Krasnodar, berbagi pengalamannya dalam membangun dan memberikan aplikasi iOS kepada pengguna yang terakumulasi selama debugging CI / CD.



Latihan


Semua orang yang terhubung dengan pengembangan aplikasi untuk perangkat Apple telah berhasil menghargai kegunaan infrastruktur yang kontroversial. Kesulitan ada di mana-mana: dari menu profil pengembang hingga alat debugging dan perakitan.

Ada banyak artikel tentang dasar-dasar di internet, jadi kami akan mencoba menyoroti hal utama. Inilah yang Anda butuhkan untuk berhasil membangun aplikasi:

  • Akun pengembang ;
  • perangkat berbasis macOS bertindak sebagai server pembangun;
  • sertifikat pengembang yang dihasilkan , yang kemudian akan digunakan untuk menandatangani aplikasi;
  • aplikasi yang dibuat dengan ID unik (pentingnya Bundle Identifier harus diperhatikan, karena penggunaan wildcard ID membuat tidak mungkin menggunakan banyak fungsi aplikasi, misalnya: Domain Terkait, Push Notification, Apple Sign In dan lain-lain);
  • profil tanda tangan aplikasi.

Sertifikat pengembang harus dihasilkan melalui Keychain pada perangkat macOS apa pun. Jenis sertifikat sangat penting. Tergantung pada lingkungan aplikasi (Dev, QA, Pementasan, Produksi), itu akan berbeda (Pengembangan atau Distribusi), serta jenis profil tanda tangan aplikasi.

Jenis utama dari profil:

  • Pengembangan - dirancang untuk menandatangani aplikasi tim pengembangan, menggunakan sertifikat Pengembangan (nama formulir iPhone Developer: XXXXX);
  • Ad Hoc - dimaksudkan untuk menandatangani aplikasi pengujian dan verifikasi internal oleh departemen QA, menggunakan sertifikat Distribusi pengembang (nama jenis Distribusi iPhone: XXXXX);
  • App Store - rilis build untuk pengujian eksternal melalui TestFlight dan mengunggah ke App Store, menggunakan sertifikat Distribusi pengembang.

Saat membuat profil Pengembangan dan Ad Hoc, daftar perangkat tempat Anda dapat menginstal build juga ditunjukkan , yang memungkinkan Anda untuk membatasi akses lebih lanjut bagi pengguna. Profil App Store tidak memiliki daftar perangkat, karena TestFlight bertanggung jawab untuk kontrol akses selama pengujian beta tertutup, yang akan dibahas nanti.

Untuk kejelasan, Anda dapat mempresentasikan profil pengembang dalam bentuk tablet di bawah ini. Lebih mudah untuk memahami parameter apa untuk perakitan yang kita butuhkan dan di mana mendapatkannya.



Majelis


Untuk membuatnya lebih mudah untuk memisahkan rakitan berdasarkan proyek dan lingkungan, kami menggunakan nama profil tampilan ${ProjectName}_${Instance}, yaitu, nama proyek + instance (tergantung pada lingkungan aplikasi: Dev, QA, GD, Staging, Live, dan sebagainya).

Saat mengimpor ke server build, profil mengubah namanya menjadi ID unik dan pindah ke folder /Users/$Username/Library/MobileDevice/Provisioning Profiles(yang $Usernameterkait dengan nama akun pengguna server build).

Ada dua cara untuk membangun file * .ipa - usang (PackageApplication) dan modern (melalui kreasi dan ekspor XcAchive). Metode pertama dianggap usang, karena dari versi 8.3 modul pengemasan file aplikasi telah dihapus dari distribusi Xcode. Untuk menggunakannya, Anda perlu menyalin modul dari Xcode lama (versi 8.2 dan sebelumnya) ke folder:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

Dan kemudian jalankan perintah:

chmod +x /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/*

Selanjutnya, Anda perlu mengumpulkan * .app-file aplikasi:

xcodebuild \
-workspace $ProjectDir/$ProjectName.xcworkspace \
-scheme $SchemeName \
-sdk iphoneos \
build \
-configuration Release \
-derivedDataPath build \
CODE_SIGN_IDENTITY=”$DevAccName”\
PROVISIONING_PROFILE=”$ProfileId
DEPLOYMENT_POSTPROCESSING=YES \
SKIP_INSTALL=YES \
ENABLE_BITCODE=NO

Di mana:

-workspace- path ke file proyek.

-scheme- sirkuit bekas yang ditentukan dalam proyek.

-derivedDataPath- jalur untuk membongkar aplikasi yang telah dirakit (* .app).

CODE_SIGN_IDENTITY- nama akun pengembang yang dapat diverifikasi di Keychain (Pengembang iPhone: XXXX XXXXXXX, tanpa TeamID dalam tanda kurung).



PROVISIONING_PROFILE- ID profil untuk menandatangani aplikasi, yang dapat diperoleh dengan perintah:

cd "/Users/$Username/Library/MobileDevice/Provisioning Profiles/" && find *.mobileprovision -type f | xargs grep -li ">${ProjectName}_${Instance}<" | sed -e 's/.mobileprovision//'

Jika aplikasi menggunakan profil tambahan (misalnya, untuk Pemberitahuan Push), maka PROVISIONING_PROFILEsebutkan sebagai berikut :

APP_PROFILE=”$AppProfile” \
EXTENSION_PROFILE=”$ExtProfile” \

Selanjutnya, file * .app yang dihasilkan harus dikemas dalam * .ipa. Untuk melakukan ini, Anda dapat menggunakan perintah dari formulir:

/usr/bin/xcrun --sdk iphoneos PackageApplication \
-v $(find "$ProjectDir/build/Build/Products/Release-iphoneos" -name "*.app") \
-o "$ProjectDir/$ProjectName_$Instance.ipa"

Namun, metode ini dianggap usang dari sudut pandang Apple. Adalah relevan untuk mendapatkan * .ipa dengan mengekspor dari arsip aplikasi.

Pertama, Anda perlu mengumpulkan arsip dengan perintah:

xcodebuild \
-workspace $ProjectDir/$ProjectName.xcworkspace \
-scheme $SchemeName \
-sdk iphoneos \
-configuration Release \
archive \
-archivePath $ProjectDir/build/$ProjectName.xcarchive \
CODE_SIGN_IDENTITY=”$DevAccName” \
PROVISIONING_PROFILE=”$ProfileId
ENABLE_BITCODE=NO \
SYNCHRONOUS_SYMBOL_PROCESSING=FALSE

Perbedaannya ada pada metode perakitan dan opsi SYNCHRONOUS_SYMBOL_PROCESSINGyang menonaktifkan pembongkaran karakter selama perakitan.

Selanjutnya, kita perlu membuat file dengan pengaturan ekspor:

ExportSettings="$ProjectDir/exportOptions.plist"

cat << EOF > $ExportSettings
<?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>compileBitcode</key>
<false/>
<key>uploadBitcode</key>
<false/>
<key>uploadSymbols</key>
<false/>
<key>method</key>
<string>$Method</string>
<key>provisioningProfiles</key>
<dict>
<key>$BundleID</key>
<string>$ProfileId</string>
</dict>
<key>signingCertificate</key>
<string>$DevAccName</string>
<key>signingStyle</key>
<string>manual</string>
<key>stripSwiftSymbols</key>
<true/>
<key>teamID</key>
<string>$TeamID</string>
<key>thinning</key>
<string><none></string>
</dict>
</plist>
EOF

Di mana:

$Method- metode pengiriman sesuai dengan jenis profil tanda tangan aplikasi, yaitu, untuk Pengembangan, nilainya akan dikembangkan, untuk Ad Hoc - ad-hoc, dan untuk App Store - app-store.

$BundleID- ID aplikasi yang ditentukan dalam pengaturan aplikasi. Anda dapat memeriksa dengan perintah:

defaults read $ProjectDir/Info CFBundleIdentifier

$DevAccName $ProfileId- pengaturan untuk nama pengembang dan ID profil tanda tangan yang digunakan sebelumnya dan harus cocok dengan nilai-nilai dalam pengaturan ekspor.

$TeamID- ID sepuluh digit dalam tanda kurung setelah nama pengembang, contoh: Pengembang iPhone: ....... (XXXXXXXXXX); dapat check in Keychain.

Selanjutnya, menggunakan perintah ekspor, kita mendapatkan file * .ipa yang diperlukan:

xcodebuild \
-exportArchive \
-archivePath $ProjectDir/build/$ProjectName.xcarchive \
-exportPath $ProjectDir \
-exportOptionsPlist $ExportSettings

Pengiriman


Sekarang file yang dikumpulkan harus dikirim ke pengguna akhir, yaitu, diinstal pada perangkat.

Untuk distribusi Pengembangan dan pembangunan Ad Hoc, ada banyak layanan seperti HockeyApp, AppBlade dan lainnya, tetapi dalam artikel ini kita akan berbicara tentang server yang berdiri sendiri untuk mendistribusikan aplikasi.

Menginstal aplikasi untuk iOS berlangsung dalam 2 tahap:

  1. Mendapatkan manifes instalasi aplikasi melalui Layanan Item.
  2. Menginstal file * .ipa sesuai dengan informasi yang ditentukan dalam manifes via HTTPS.

Jadi, untuk permulaan, kita perlu membuat manifes instalasi (tipe file * .plist) dengan perintah:

cat << EOF > $manifest
<?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>items</key>
<array>
<dict>
<key>assets</key>
<array>
<dict>
<key>kind</key>
<string>software-package</string>
<key>url</key>
<string>$ipaUrl</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>$BundleID</string>
<key>bundle-version</key>
<string>$AppVersion</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>$ProjectName_$Instance</string>
<key>subtitle</key>
<string>$Instance</string>
</dict>
</dict>
</array>
</dict>
</plist>
EOF

Seperti yang Anda lihat, manifes berisi hampir semua parameter yang terlibat dalam perakitan aplikasi.

Versi aplikasi ( $AppVersion) dapat diperiksa dengan perintah:

defaults read $ProjectDir/Info CFBundleVersion

Parameter $ipaUrlberisi tautan langsung untuk mengunduh file * .ipa. Dari iOS versi ketujuh, aplikasi harus diinstal melalui HTTPS. Dalam versi kedelapan, format manifes telah sedikit berubah: blok dengan pengaturan untuk ikon aplikasi formulir telah dihapus

<images>
   <image>...</image>
</images>

Jadi, untuk menginstal aplikasi, halaman html sederhana dengan tautan dari form sudah cukup:

itms-services://?action=download-manifest&url=https://$ServerUrl/$ProjectName/$Instance/iOS/$AppVersion/manifest.plist

Untuk kebutuhan departemen pengembangan dan pengujian, Plarium telah menciptakan aplikasi pemasangan build-nya, yang memberi kita:

  • otonomi dan kemandirian,
  • kontrol akses terpusat dan pengamanan instalasi aplikasi melalui "sementara", tautan yang dibuat secara dinamis,
  • fungsionalitas yang dapat diperluas (yaitu, tim pengembangan, jika perlu, dapat mengintegrasikan fungsi yang hilang ke dalam aplikasi yang ada).

Pengujian


Sekarang kita akan berbicara tentang pengujian aplikasi pra-rilis menggunakan TestFlight .

Prasyarat untuk mengunduh adalah jenis profil tanda tangan App Store dan keberadaan kunci API yang dihasilkan.

Ada beberapa cara untuk mengunduh aplikasi:

  • melalui Xcode (Organizer),
  • melalui altool,
  • melalui Application Loader untuk versi Xcode lama (sekarang Transporter).

Untuk memuat otomatis, altool digunakan, yang juga memiliki dua metode otorisasi:

  • Sandi Khusus Aplikasi,
  • kunci API

Lebih baik mengunduh aplikasi menggunakan Kunci API.

Untuk mendapatkan Kunci API, ikuti tautan dan hasilkan kunci. Selain kunci itu sendiri dalam format * .p8, kita akan membutuhkan dua parameter: IssuerID dan KeyID.



Selanjutnya, kami mengimpor kunci yang diunduh ke server build:

mkdir -p ~/.appstoreconnect/private_keys
mv ~/Downloads/AuthKey_${KeyID}.p8 ~/.appstoreconnect/private_keys/

Sebelum memuat aplikasi ke TestFlight, Anda perlu memvalidasi aplikasi, lakukan ini dengan perintah:

xcrun altool \
--validate-app \
-t ios \
-f $(find "$ProjectDir" -name "*.ipa") \
--apiKey “$KeyID” \
--apiIssuer “$IssuerID

Di mana apiKeydan apiIssuermemiliki nilai bidang dari halaman pembuatan kunci API.

Kemudian, setelah validasi berhasil, kami memuat aplikasi dengan perintah --upload-appdengan parameter yang sama.

Aplikasi akan diuji oleh Apple dalam satu hingga dua hari dan setelah itu akan tersedia untuk penguji eksternal: mereka akan dikirimi tautan email untuk instalasi.

Cara lain untuk mengunduh aplikasi melalui altool adalah dengan menggunakan Kata Sandi Khusus Aplikasi.

Untuk mendapatkan Kata Sandi Khusus Aplikasi, Anda harus mengikuti tautan dan membuatnya di bagian Keamanan.



Selanjutnya, buat catatan server build di Keychain dengan kata sandi ini. Dari versi 11 Xcode, ini dapat dilakukan dengan perintah:

xcrun altool --store-password-in-keychain-item "Altool" -u "$DeveloperName" -p $AppPswd

Di mana:

$DeveloperNameadalah nama akun pengembang iOS yang digunakan untuk masuk ke layanan Apple.

$AppPswd- Sandi Khusus Aplikasi yang dihasilkan.

Selanjutnya, kita mendapatkan nilai dari parameter asc-provider dan memverifikasi keberhasilan mengimpor kata sandi dengan perintah:

xcrun altool --list-providers -u "$DeveloperName" -p "@keychain:Altool"

Kami mendapatkan kesimpulan:

Provider listing:
- Long Name - - Short Name -
XXXXXXX        XXXXXXXXX

Seperti yang dapat Anda lihat, nilai Nama Singkat (penyedia asc) yang diinginkan cocok dengan parameter $ TeamID yang kami gunakan saat membangun aplikasi.

Untuk memvalidasi dan memuat aplikasi di TestFlight, gunakan perintah:

xcrun altool \
--(validate|upload)-app \  
-f $(find "$ProjectDir" -name "*.ipa") \
-u "$DeveloperName" \
-p "@keychain:Altool" \

Sebagai nilai parameter, -pAnda bisa mengambil nilai $AppPswddalam bentuk tidak terenkripsi (eksplisit).

Namun, seperti yang telah disebutkan, dari sudut pandang operabilitas, lebih baik untuk memilih Kunci API untuk altool otorisasi, karena berbagai masalah ditemui dalam versi Xcode yang berbeda (tidak melihat Keychain, kesalahan otorisasi selama bongkar, dll.).

Faktanya, itu saja. Saya berharap semua yang terlibat dalam rilis berhasil dan rilis bebas masalah di App Store.

All Articles