Mga tampok ng pagbuo at paghahatid ng mga iOS application

Sa artikulong ito, ibinabahagi namin ang karanasan sa pag-assemble at paghahatid ng mga iOS application sa mga user, na naipon ng Plarium Krasnodar studio sa proseso ng pag-debug ng CI/CD.

Mga tampok ng pagbuo at paghahatid ng mga iOS application

Pagsasanay

Ang bawat tao na nasa isang paraan o iba pang kasangkot sa pagbuo ng mga aplikasyon para sa mga aparatong Apple ay pinahahalagahan na ang kontrobersyal na kaginhawahan ng imprastraktura. Ang mga paghihirap ay matatagpuan sa lahat ng dako: mula sa menu ng profile ng developer hanggang sa debug at bumuo ng mga tool.

Maraming mga artikulo tungkol sa "mga pangunahing kaalaman" sa Internet, kaya susubukan naming i-highlight ang pangunahing bagay. Narito ang kailangan mo upang matagumpay na mabuo ang iyong aplikasyon:

  • developer account;
  • isang macOS-based na device na kumikilos bilang build server;
  • nabuo sertipiko ng developer, na higit pang gagamitin para lagdaan ang aplikasyon;
  • nilikha application na may natatanging ID (dapat tandaan ang kahalagahan ng Bundle Identifier, dahil ang paggamit ng wildcard ID ay ginagawang imposibleng gumamit ng maraming function ng application, halimbawa: Mga Kaugnay na Domain, Push Notification, Apple Sign In at iba pa);
  • profile mga lagda ng aplikasyon.

Dapat na bumuo ng certificate ng developer sa pamamagitan ng Keychain sa anumang macOS device. Napakahalaga ng uri ng sertipiko. Depende sa environment ng application (Dev, QA, Staging, Production) ito ay mag-iiba (Development o Distribution), gayundin ang uri ng application signature profile.

Pangunahing uri ng mga profile:

  • Development - nilayon para sa pagpirma sa aplikasyon ng development team, isang Development certificate ang ginagamit (type name iPhone Developer: XXXXX);
  • Ad Hoc - nilayon para sa pagpirma ng isang pagsubok na aplikasyon at panloob na pag-verify ng departamento ng QA, ginagamit ang sertipiko ng Pamamahagi ng developer (type name iPhone Distribution: XXXXX);
  • App Store - i-release ang build para sa external na pagsubok sa pamamagitan ng TestFlight at pag-upload sa App Store, ginagamit ang Distribution certificate ng developer.

Kapag bumubuo ng mga profile ng Development at Ad Hoc, ipinapahiwatig din ito listahan ng device, kung saan maaari kang mag-install ng build, na nagbibigay-daan sa iyong higit pang paghigpitan ang pag-access para sa mga user. Walang listahan ng mga device sa profile ng App Store, dahil ang kontrol sa pag-access sa panahon ng closed beta testing ay pinangangasiwaan ng TestFlight, na tatalakayin sa ibang pagkakataon.

Para sa kalinawan, maaari mong ipakita ang profile ng developer sa anyo ng isang talahanayan sa ibaba. Ginagawa nitong mas madaling maunawaan kung anong mga parameter ang kailangan namin para sa pagpupulong at kung saan kukunin ang mga ito.

Mga tampok ng pagbuo at paghahatid ng mga iOS application

Assembly

Upang gawing mas madaling paghiwalayin ang mga asembliya ayon sa proyekto at kapaligiran, ginagamit namin ang mga pangalan ng profile tulad ng ${ProjectName}_${Instance}, iyon ay, pangalan ng proyekto + instance (depende sa environment ng application: Dev, QA, GD, Staging, Live, at iba pa).

Kapag na-import sa build server, binabago ng profile ang pangalan nito sa isang natatanging ID at inilipat sa folder /Users/$Username/Library/MobileDevice/Provisioning Profiles (Saan $Username tumutugma sa pangalan ng user account ng build server).

Mayroong dalawang mga paraan upang makabuo ng isang *.ipa file - legacy (packageApplication) at moderno (sa pamamagitan ng xcachive na paglikha at pag -export). Ang unang pamamaraan ay itinuturing na hindi na ginagamit, dahil mula sa bersyon 8.3 ang module ng packaging ng app ng app ay tinanggal mula sa pamamahagi ng XCODE. Upang magamit ito, kailangan mong kopyahin ang module mula sa lumang xcode (bersyon 8.2 at mas maaga) sa folder:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

At pagkatapos ay patakbuhin ang utos:

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

Susunod na kailangan mong kolektahin ang *.app file ng application:

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

Saan:

-workspace - Landas sa file ng proyekto.

-scheme — ang ginamit na pamamaraan, na tinukoy sa proyekto.

-derivedDataPath — landas upang i-download ang binuong application (*.app).

CODE_SIGN_IDENTITY — ang pangalan ng developer account, na maaaring ma-verify sa Keychain (iPhone Developer: XXXX XXXXXXX, walang TeamID sa mga bracket).

Mga tampok ng pagbuo at paghahatid ng mga iOS application

PROVISIONING_PROFILE — Profile ID para sa pagpirma sa aplikasyon, na maaaring makuha gamit ang utos:

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

Kung ang application ay gumagamit ng isang karagdagang profile (halimbawa, para sa mga abiso sa pagtulak), kung gayon sa halip na PROVISIONING_PROFILE ipahiwatig:

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

Susunod, ang resultang *.app file ay dapat na naka-package sa *.ipa. Upang gawin ito, maaari kang gumamit ng isang utos tulad ng:

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

Gayunpaman, ang pamamaraang ito ay itinuturing na hindi na ginagamit mula sa pananaw ng Apple. May kaugnayan ang pagkuha ng *.ipa sa pamamagitan ng pag-export mula sa archive ng application.

Una kailangan mong kolektahin ang archive gamit ang utos:

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

Ang mga pagkakaiba ay nasa paraan ng pagpupulong at mga pagpipilian SYNCHRONOUS_SYMBOL_PROCESSING, na hindi pinapagana ang pag-unload ng simbolo sa oras ng pagbuo.

Susunod na kailangan naming bumuo ng isang file na may mga setting ng pag-export:

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

Saan:

$Method — paraan ng paghahatid, tumutugma sa uri ng profile ng lagda ng application, iyon ay, para sa Development ang halaga ay magiging development, para sa Ad Hoc - ad-hoc, at para sa App Store - app-store.

$BundleID — Application ID, na tinukoy sa mga setting ng application. Maaari mong suriin gamit ang utos:

defaults read $ProjectDir/Info CFBundleIdentifier

$DevAccName и $ProfileId — pangalan ng developer at mga setting ng profile ID ng lagda na ginamit dati at dapat tumugma sa mga halaga sa mga setting ng pag-export.

$TeamID — sampung-digit na ID sa mga bracket pagkatapos ng pangalan ng developer, halimbawa: iPhone Developer: …… (XXXXXXXXXX); maaaring i-check sa Keychain.

Susunod, gamit ang export command, makuha namin ang kinakailangang *.ipa file:

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

Paghahatid

Ngayon ang nakolekta na file ay kailangang maihatid sa end user, iyon ay, naka -install sa aparato.

Mayroong maraming mga serbisyo para sa pamamahagi ng Development at Ad Hoc build, tulad ng HockeyApp, AppBlade at iba pa, ngunit sa artikulong ito ay pag-uusapan natin ang tungkol sa isang standalone na server para sa pamamahagi ng mga application.

Ang pag-install ng application para sa iOS ay nagaganap sa 2 yugto:

  1. Pagtanggap ng application installation manifest sa pamamagitan ng Items Service.
  2. Pag-install ng *.ipa file ayon sa impormasyong tinukoy sa manifest sa pamamagitan ng HTTPS.

Kaya, kailangan muna nating bumuo ng manifest ng pag-install (uri ng file *.plist) gamit ang command:

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

Tulad ng nakikita mo, ang manifest ay naglalaman ng halos lahat ng mga parameter na kasangkot sa pagbuo ng application.

Bersyon ng aplikasyon ($AppVersion) Maaaring suriin gamit ang utos:

defaults read $ProjectDir/Info CFBundleVersion

Parametro $ipaUrl naglalaman ng direktang link para i-download ang *.ipa file. Mula sa ikapitong bersyon ng iOS, dapat na mai-install ang application sa pamamagitan ng HTTPS. Sa ikawalong bersyon, bahagyang nagbago ang format ng manifest: mga bloke na may mga setting para sa mga icon ng application tulad ng

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

Kaya, upang mai-install ang application, sapat na ang isang simpleng HTML page na may link na tulad nito:

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

Para sa mga pangangailangan ng mga departamento ng pag-unlad at pagsubok, ang Plarium ay lumikha ng sarili nitong build install application, na nagbibigay sa amin ng:

  • awtonomiya at kalayaan,
  • sentralisasyon ng kontrol sa pag-access at secure na pag-install ng mga application sa pamamagitan ng "pansamantalang" dynamic na nilikha na mga link,
  • napapalawak na functionality (iyon ay, ang development team, kung kinakailangan, ay maaaring isama ang mga nawawalang function sa isang umiiral na application).

Pagsubok

Ngayon ay pag-uusapan natin ang tungkol sa pre-release na pagsubok ng application na ginagamit TestFlight.

Ang mga kinakailangang kundisyon para sa pag-download ay ang uri ng profile ng lagda ng App Store at ang pagkakaroon ng mga nabuong API key.

Mayroong maraming mga paraan upang i -download ang application:

  • sa pamamagitan ng Xcode (Organizer),
  • Via Altool,
  • sa pamamagitan ng Application Loader para sa mga mas lumang bersyon ng Xcode (Transporter ngayon).

Para sa awtomatikong pag-download, ginagamit ang altool, na mayroon ding dalawang paraan ng awtorisasyon:

  • Password na Partikular sa App,
  • API Key.

Mas mainam na i -download ang application gamit ang API key.

Upang makuha ang API Key, pumunta sa link at bumuo ng isang susi. Bilang karagdagan sa mismong key sa *.p8 na format, kakailanganin namin ng dalawang parameter: IssuerID at KeyID.

Mga tampok ng pagbuo at paghahatid ng mga iOS application

Susunod, i-import ang na-download na key sa build server:

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

Bago i-upload ang application sa TestFlight, kailangan mong patunayan ang application, ginagawa namin ito gamit ang command:

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

saan apiKey и apiIssuer may mga halaga ng field mula sa pahina ng pagbuo ng key ng API.

Susunod, sa matagumpay na pagpapatunay, ni-load namin ang application gamit ang command --upload-app na may parehong mga parameter.

Ang application ay susuriin ng Apple sa loob ng isa o dalawang araw at pagkatapos ay magiging available sa mga panlabas na tester: sila ay magpapadala sa email ng mga link para sa pag-install.

Ang isa pang paraan upang mag-download ng isang application sa pamamagitan ng altool ay ang paggamit ng Password na Partikular sa App.

Upang makuha ang password na tukoy sa app na kailangan mong puntahan link at buuin ito sa seksyong Seguridad.

Mga tampok ng pagbuo at paghahatid ng mga iOS application

Susunod, dapat kang lumikha ng talaan ng build server sa Keychain gamit ang password na ito. Mula sa bersyon 11 ng Xcode maaari itong gawin gamit ang utos:

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

Saan:

$DeveloperName - Ang pangalan ng iOS developer account na ginamit upang mag -log in sa Apple Services.

$AppPswd — nabuong Password na Partikular sa App.

Susunod, makuha namin ang halaga ng parameter ng asc-provider at suriin ang tagumpay ng pag-import ng password gamit ang command:

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

Nakukuha namin ang output:

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

Gaya ng nakikita mo, ang kinakailangang halaga ng Maikling Pangalan (asc-provider) ay tumutugma sa parameter na $TeamID na ginamit namin sa pagbuo ng application.

Upang patunayan at i-load ang application sa TestFlight, gamitin ang command:

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

Bilang halaga ng parameter -p maaari mong kunin ang halaga $AppPswd sa hindi naka-encrypt (tahasang) form.

Gayunpaman, tulad ng nabanggit na, mula sa punto ng view ng pagganap, mas mahusay na pumili ng API Key para sa awtorisasyon ng altool, dahil ang iba't ibang mga bersyon ng Xcode ay may ilang mga problema ("hindi nakikita" Keychain, mga error sa awtorisasyon sa panahon ng pag-upload, atbp.).

Iyon lang, talaga. Nais ko ang lahat na kasangkot sa matagumpay na pagbuo at mga paglabas na walang problema sa App Store.

Pinagmulan: www.habr.com

Magdagdag ng komento