Ciri membina dan menyampaikan aplikasi iOS

Dalam artikel ini, kami berkongsi pengalaman memasang dan menghantar aplikasi iOS kepada pengguna, yang telah dikumpulkan oleh studio Plarium Krasnodar dalam proses penyahpepijatan CI/CD.

Ciri membina dan menyampaikan aplikasi iOS

Latihan

Setiap orang yang terlibat dalam satu atau lain cara dalam pembangunan aplikasi untuk peranti Apple telah menghargai kemudahan kontroversi infrastruktur. Kesukaran ditemui di mana-mana: daripada menu profil pembangun kepada alat nyahpepijat dan binaan.

Terdapat banyak artikel mengenai "asas" di Internet, jadi kami akan cuba menyerlahkan perkara utama. Inilah yang anda perlukan untuk membina aplikasi anda dengan jayanya:

  • akaun pembangun;
  • peranti berasaskan macOS yang bertindak sebagai pelayan binaan;
  • dihasilkan sijil pemaju, yang akan digunakan selanjutnya untuk menandatangani permohonan;
  • aplikasi yang dicipta dengan unik ID (kepentingan Pengecam Bundle perlu diberi perhatian, kerana penggunaan ID kad bebas menjadikannya mustahil untuk menggunakan banyak fungsi aplikasi, contohnya: Domain Berkaitan, Pemberitahuan Tolak, Log Masuk Apple dan lain-lain);
  • profil tandatangan permohonan.

Sijil pembangun mesti dijana melalui Rantai Kunci pada mana-mana peranti macOS. Jenis sijil sangat penting. Bergantung pada persekitaran aplikasi (Dev, QA, Staging, Production) ia akan berbeza (Pembangunan atau Pengedaran), begitu juga dengan jenis profil tandatangan aplikasi.

Jenis profil utama:

  • Pembangunan - bertujuan untuk menandatangani permohonan pasukan pembangunan, sijil Pembangunan digunakan (nama jenis Pembangun iPhone: XXXXX);
  • Ad Hoc - bertujuan untuk menandatangani permohonan ujian dan pengesahan dalaman oleh jabatan QA, sijil Pengedaran pembangun digunakan (nama jenis Pengedaran iPhone: XXXXX);
  • App Store - keluarkan binaan untuk ujian luaran melalui TestFlight dan muat naik ke App Store, sijil Pengedaran pembangun digunakan.

Apabila menjana profil Pembangunan dan Ad Hoc, ia juga ditunjukkan senarai peranti, di mana anda boleh memasang binaan, yang membolehkan anda menyekat lagi akses untuk pengguna. Tiada senarai peranti dalam profil App Store, kerana kawalan akses semasa ujian beta tertutup dikendalikan oleh TestFlight, yang akan dibincangkan kemudian.

Untuk kejelasan, anda boleh membentangkan profil pembangun dalam bentuk jadual di bawah. Ini menjadikannya lebih mudah untuk memahami parameter yang kami perlukan untuk pemasangan dan dari mana untuk mendapatkannya.

Ciri membina dan menyampaikan aplikasi iOS

Perhimpunan

Untuk memudahkan pengasingan perhimpunan mengikut projek dan persekitaran, kami menggunakan nama profil seperti ${ProjectName}_${Instance}, iaitu nama projek + contoh (bergantung pada persekitaran aplikasi: Dev, QA, GD, Staging, Live dan sebagainya).

Apabila diimport ke pelayan binaan, profil menukar namanya kepada ID unik dan dialihkan ke folder /Users/$Username/Library/MobileDevice/Provisioning Profiles (di mana $Username sepadan dengan nama akaun pengguna pelayan binaan).

Terdapat dua cara untuk membina fail *.ipa - warisan (PackageApplication) dan moden (melalui penciptaan dan eksport XcAchive). Kaedah pertama dianggap usang, kerana sejak versi 8.3 modul pembungkusan fail aplikasi telah dialih keluar daripada pengedaran Xcode. Untuk menggunakannya, anda perlu menyalin modul dari Xcode lama (versi 8.2 dan lebih awal) ke folder:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

Dan kemudian jalankan arahan:

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

Seterusnya anda perlu mengumpul fail *.app 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 — laluan ke fail projek.

-scheme — skim yang digunakan, yang dinyatakan dalam projek.

-derivedDataPath — laluan untuk memuat turun aplikasi yang dipasang (*.app).

CODE_SIGN_IDENTITY — nama akaun pembangun, yang boleh disahkan dalam Rantai Kunci (Pembangun iPhone: XXXX XXXXXXX, tanpa ID Pasukan dalam kurungan).

Ciri membina dan menyampaikan aplikasi iOS

PROVISIONING_PROFILE — ID Profil untuk menandatangani aplikasi, yang boleh diperolehi dengan arahan:

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 (contohnya, untuk Pemberitahuan Tolak), maka sebaliknya PROVISIONING_PROFILE menunjukkan:

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

Seterusnya, fail *.app yang terhasil hendaklah dibungkus ke dalam *.ipa. Untuk melakukan ini, anda boleh menggunakan arahan seperti:

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

Walau bagaimanapun, kaedah ini dianggap usang dari sudut pandangan Apple. Adalah relevan untuk mendapatkan *.ipa dengan mengeksport daripada arkib aplikasi.

Mula-mula anda perlu mengumpul arkib dengan arahan:

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

Perbezaannya terletak pada kaedah pemasangan dan pilihan SYNCHRONOUS_SYMBOL_PROCESSING, yang melumpuhkan pemunggahan simbol pada masa binaan.

Seterusnya kita perlu menjana fail dengan tetapan eksport:

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 — kaedah penghantaran, sepadan dengan jenis profil tandatangan aplikasi, iaitu, untuk Pembangunan, nilainya ialah pembangunan, untuk Ad Hoc - ad-hoc, dan untuk App Store - kedai aplikasi.

$BundleID — ID Aplikasi, yang dinyatakan dalam tetapan aplikasi. Anda boleh menyemak dengan arahan:

defaults read $ProjectDir/Info CFBundleIdentifier

$DevAccName и $ProfileId — nama pembangun dan tetapan ID profil tandatangan yang digunakan sebelum ini dan mesti sepadan dengan nilai dalam tetapan eksport.

$TeamID — ID sepuluh digit dalam kurungan selepas nama pembangun, contoh: Pembangun iPhone: …… (XXXXXXXXXX); boleh check in Keychain.

Seterusnya, menggunakan arahan eksport, kami memperoleh fail *.ipa yang diperlukan:

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

Penghantaran

Sekarang fail yang dikumpul perlu dihantar kepada pengguna akhir, iaitu, dipasang pada peranti.

Terdapat banyak perkhidmatan untuk mengedarkan binaan Pembangunan dan Ad Hoc, seperti HockeyApp, AppBlade dan lain-lain, tetapi dalam artikel ini kita akan bercakap tentang pelayan kendiri untuk mengedarkan aplikasi.

Memasang aplikasi untuk iOS berlaku dalam 2 peringkat:

  1. Menerima manifes pemasangan aplikasi melalui Perkhidmatan Item.
  2. Pemasangan fail *.ipa mengikut maklumat yang dinyatakan dalam manifes melalui HTTPS.

Oleh itu, kita perlu menjana manifes pemasangan (jenis fail *.plist) terlebih dahulu dengan arahan:

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 mengandungi hampir semua parameter yang terlibat dalam membina aplikasi.

Versi aplikasi ($AppVersion) boleh disemak dengan arahan:

defaults read $ProjectDir/Info CFBundleVersion

Parameter $ipaUrl mengandungi pautan terus untuk memuat turun fail *.ipa. Daripada versi ketujuh iOS, aplikasi mesti dipasang melalui HTTPS. Dalam versi kelapan, format manifes telah berubah sedikit: blok dengan tetapan untuk ikon aplikasi seperti

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

Oleh itu, untuk memasang aplikasi, halaman HTML mudah dengan pautan seperti ini sudah cukup:

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

Untuk keperluan jabatan pembangunan dan ujian, Plarium telah mencipta aplikasi pemasangan binaannya sendiri, yang memberikan kami:

  • autonomi dan kemerdekaan,
  • pemusatan kawalan akses dan pemasangan aplikasi yang selamat melalui pautan yang dicipta secara dinamik "sementara",
  • kefungsian boleh dikembangkan (iaitu, pasukan pembangunan, jika perlu, boleh menyepadukan fungsi yang hilang ke dalam aplikasi sedia ada).

Ujian

Sekarang kita akan bercakap tentang ujian pra-keluaran aplikasi menggunakan ujian Penerbangan.

Syarat yang diperlukan untuk memuat turun ialah jenis profil tandatangan App Store dan kehadiran kunci API yang dijana.

Terdapat beberapa cara untuk memuat turun aplikasi:

  • melalui Xcode (Penganjur),
  • melalui altool,
  • melalui Application Loader untuk versi lama Xcode (kini Transporter).

Untuk muat turun automatik, altool digunakan, yang juga mempunyai dua kaedah kebenaran:

  • Kata Laluan Khusus Apl,
  • Kunci API.

Adalah lebih baik untuk memuat turun aplikasi menggunakan Kunci API.

Untuk mendapatkan Kunci API, pergi ke pautan dan menjana kunci. Sebagai tambahan kepada kunci itu sendiri dalam format *.p8, kami memerlukan dua parameter: IssuerID dan KeyID.

Ciri membina dan menyampaikan aplikasi iOS

Seterusnya, import kunci yang dimuat turun ke pelayan binaan:

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

Sebelum memuat naik aplikasi ke TestFlight, anda perlu mengesahkan aplikasi, kami melakukan ini dengan arahan:

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

Где apiKey и apiIssuer mempunyai nilai medan daripada halaman penjanaan kunci API.

Seterusnya, setelah pengesahan berjaya, kami memuatkan aplikasi dengan arahan --upload-app dengan parameter yang sama.

Aplikasi ini akan diuji oleh Apple dalam masa satu atau dua hari dan kemudian akan tersedia kepada penguji luaran: mereka akan dihantar melalui e-mel pautan untuk pemasangan.

Cara lain untuk memuat turun aplikasi melalui altool ialah menggunakan Kata Laluan Khusus Apl.

Untuk mendapatkan Kata Laluan Khusus Apl yang anda perlu pergi ke pautan dan jananya dalam bahagian Keselamatan.

Ciri membina dan menyampaikan aplikasi iOS

Seterusnya, anda harus mencipta rekod pelayan binaan dalam Rantai Kunci dengan kata laluan ini. Dari versi 11 Xcode ini boleh dilakukan dengan arahan:

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

Di mana:

$DeveloperName — nama akaun pembangun iOS yang digunakan untuk log masuk ke perkhidmatan Apple.

$AppPswd — dijana Kata Laluan Khusus Apl.

Seterusnya, kami mendapat nilai parameter asc-provider dan semak kejayaan import kata laluan dengan arahan:

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

Kami mendapat output:

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

Seperti yang anda lihat, nilai Nama Pendek yang diperlukan (penyedia asc) bertepatan dengan parameter $TeamID yang kami gunakan semasa membina aplikasi.

Untuk mengesahkan dan memuatkan aplikasi ke dalam TestFlight, gunakan arahan:

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

Sebagai nilai parameter -p anda boleh mengambil nilai $AppPswd dalam bentuk yang tidak disulitkan (eksplisit).

Walau bagaimanapun, seperti yang telah disebutkan, dari sudut prestasi, adalah lebih baik untuk memilih Kunci API untuk kebenaran altool, kerana versi Xcode yang berbeza mempunyai masalah tertentu ("tidak melihat" Rantai Kunci, ralat kebenaran semasa muat naik, dsb.).

Itu sahaja, sebenarnya. Saya berharap semua orang yang terlibat berjaya membina dan keluaran bebas masalah di App Store.

Sumber: www.habr.com

Tambah komen