F'dan l-artikolu, aħna naqsmu l-esperjenza ta 'assemblaġġ u twassil ta' applikazzjonijiet iOS lill-utenti, li l-istudjo Plarium Krasnodar akkumula fil-proċess ta 'debugging CI/CD.

Taħriġ
Kull persuna li hija b'xi mod jew ieħor involuta fl-iżvilupp ta 'applikazzjonijiet għal apparati Apple diġà apprezzat il-konvenjenza kontroversjali ta' l-infrastruttura. Diffikultajiet jinstabu kullimkien: mill-menu tal-profil tal-iżviluppatur sal-għodod tad-debug u l-bini.
Hemm ħafna artikli dwar il-"baŜi" fuq l-Internet, għalhekk se nippruvaw nenfasizzaw il-ħaġa ewlenija. Hawn dak li għandek bżonn biex tibni l-applikazzjoni tiegħek b'suċċess:
- ;
- ibbażat fuq apparat macOS, jaġixxi bħala server tal-bini;
- iġġenerat , li se tintuża aktar biex tiffirma l-applikazzjoni;
- applikazzjoni maħluqa bl uniku (għandha tiġi nnutata l-importanza tal-Budle Identifier, minħabba li l-użu tal-wildcard ID jagħmilha impossibbli li jintużaw ħafna funzjonijiet tal-applikazzjoni, pereżempju: Dominji Assoċjati, Push Notifiki, Apple Sign In u oħrajn);
- firem tal-applikazzjoni.
Iċ-ċertifikat tal-iżviluppatur għandu jiġi ġġenerat permezz ta' Keychain fuq kwalunkwe apparat ibbażat fuq macOSIt-tip ta' ċertifikat huwa importanti ħafna. Skont l-ambjent tal-applikazzjoni (Żvilupp, QA, Staging, Produzzjoni), dan se jvarja (Żvilupp jew Distribuzzjoni), kif ukoll it-tip ta' profil tal-firma tal-applikazzjoni.
Tipi ewlenin ta 'profili:
- Żvilupp — iddisinjat biex jiffirma l-applikazzjoni tat-tim tal-iżvilupp, jintuża ċertifikat tal-Iżvilupp (isem tat-tip iPhone Żviluppatur: XXXXX);
- Ad Hoc - iddisinjat għall-iffirmar ta' applikazzjoni tat-test u verifika interna mid-dipartiment tal-QA, jintuża ċ-ċertifikat tad-Distribuzzjoni tal-iżviluppatur (isem tat-tip iPhone Distribuzzjoni: XXXXX);
- App Store - rilaxx build għall-ittestjar estern permezz TestFlight u uploading fl-App Store, iċ-ċertifikat tad-Distribuzzjoni tal-iżviluppatur jintuża.
Meta jiġu ġġenerati profili ta' Żvilupp u Ad Hoc, huwa indikat ukoll , li fuqha tista' tinstalla bini, li jippermettilek li tirrestrinġi aktar l-aċċess għall-utenti. M'hemm l-ebda lista ta 'apparati fil-profil tal-App Store, peress li l-kontroll tal-aċċess waqt l-ittestjar beta magħluq huwa mmaniġġjat minn TestFlight, li se jiġi diskuss aktar tard.
Għaċ-ċarezza, tista 'tippreżenta l-profil tal-iżviluppatur fil-forma ta' tabella hawn taħt. Dan jagħmilha aktar faċli li wieħed jifhem liema parametri għandna bżonn għall-assemblaġġ u minn fejn niksbuhom.

Assemblea
Biex tagħmilha aktar faċli li tissepara l-assemblaġġi skont il-proġett u l-ambjent, nużaw ismijiet tal-profil simili ${ProjectName}_${Instance}, jiġifieri, isem tal-proġett + istanza (jiddependi fuq l-ambjent tal-applikazzjoni: Dev, QA, GD, Staging, Live, eċċ).
Meta jiġi importat fis-server tal-bini, il-profil jibdel ismu għal ID unika u jitmexxa fil-folder /Users/$Username/Library/MobileDevice/Provisioning Profiles (Fejn $Username jikkorrispondi għall-isem tal-kont tal-utent tas-server tal-bini).
Hemm żewġ modi kif tibni fajl *.ipa - legat (PackageApplication) u modern (permezz tal-ħolqien u l-esportazzjoni ta 'XcAchive). L-ewwel metodu huwa kkunsidrat skadut, peress li mill-verżjoni 8.3 il-modulu tal-ippakkjar tal-fajl tal-app tneħħa mid-distribuzzjoni Xcode. Biex tużah, trid tikkopja l-modulu mill-Xcode l-antik (verżjoni 8.2 u preċedenti) għall-folder:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/
U mbagħad mexxi l-kmand:
chmod +x /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/*Imbagħad trid tiġbor il-fajl *.app tal-applikazzjoni:
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
Fejn:
-workspace — mogħdija għall-fajl tal-proġett.
-scheme — l-iskema użata, speċifikata fil-proġett.
-derivedDataPath — mogħdija biex tniżżel l-applikazzjoni immuntata (*.app).
CODE_SIGN_IDENTITY — l-isem tal-kont tal-iżviluppatur, li jista' jiġi vverifikat f'Keychain (iPhone Żviluppatur: XXXX XXXXXXX, mingħajr TeamID fil-parentesi).

PROVISIONING_PROFILE — Profil ID għall-iffirmar tal-applikazzjoni, li tista’ tinkiseb bil-kmand:
cd "/Users/$Username/Library/MobileDevice/Provisioning Profiles/" && find *.mobileprovision -type f | xargs grep -li ">${ProjectName}_${Instance}<" | sed -e 's/.mobileprovision//' Jekk l-applikazzjoni tuża profil addizzjonali (per eżempju, għal Notifiki Imbotta), imbagħad minflok PROVISIONING_PROFILE indika:
APP_PROFILE=”$AppProfile”
EXTENSION_PROFILE=”$ExtProfile” Sussegwentement, il-fajl *.app li jirriżulta għandu jiġi ppakkjat f' *.ipa. Biex tagħmel dan, tista 'tuża kmand bħal:
/usr/bin/xcrun --sdk iphoneos PackageApplication
-v $(find "$ProjectDir/build/Build/Products/Release-iphoneos" -name "*.app")
-o "$ProjectDir/$ProjectName_$Instance.ipa"Madankollu, dan il-metodu huwa meqjus skadut mill-perspettiva ta 'Apple. Huwa rilevanti li tikseb *.ipa billi tesporta mill-arkivju tal-applikazzjoni.
L-ewwel trid tiġbor l-arkivju bil-kmand:
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 Id-differenzi jinsabu fil-metodu tal-assemblaġġ u l-għażliet SYNCHRONOUS_SYMBOL_PROCESSING, li tiddiżattiva l-ħatt tas-simbolu fil-ħin tal-bini.
Sussegwentement irridu niġġeneraw fajl b'settings ta 'esportazzjoni:
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
Fejn:
$Method — metodu ta' konsenja, jikkorrispondi għat-tip ta' profil tal-firma tal-applikazzjoni, jiġifieri, għall-Iżvilupp il-valur se jkun żvilupp, għal Ad Hoc - ad-hoc, u għall-App Store - app-store.
$BundleID — ID tal-applikazzjoni, li hija speċifikata fis-settings tal-applikazzjoni. Tista 'tiċċekkja bil-kmand:
defaults read $ProjectDir/Info CFBundleIdentifier $DevAccName и $ProfileId — l-isem tal-iżviluppatur u l-issettjar tal-ID tal-profil tal-firma li ntużaw qabel u għandhom jaqblu mal-valuri fis-settings tal-esportazzjoni.
$TeamID — ID ta' għaxar ċifri fil-parentesi wara l-isem tal-iżviluppatur, eżempju: iPhone Żviluppatur: …… (XXXXXXXXXX); jista' jiġi vverifikat fil-Keychain.
Sussegwentement, billi tuża l-kmand tal-esportazzjoni, niksbu l-fajl *.ipa meħtieġ:
xcodebuild
-exportArchive
-archivePath $ProjectDir/build/$ProjectName.xcarchive
-exportPath $ProjectDir
-exportOptionsPlist $ExportSettingsKunsinna
Issa l-fajl miġbur jeħtieġ li jiġi kkonsenjat lill-utent aħħari, jiġifieri, installat fuq l-apparat.
Hemm ħafna servizzi għad-distribuzzjoni tal-iżvilupp u l-bini Ad Hoc, bħal HockeyApp, AppBlade u oħrajn, iżda f'dan l-artikolu se nitkellmu dwar server waħdu għad-distribuzzjoni tal-applikazzjonijiet.
L-installazzjoni tal-applikazzjoni għall-iOS issir f'2 stadji:
- Jirċievi l-manifest tal-installazzjoni tal-applikazzjoni permezz tas-Servizz tal-Oġġetti.
- Installazzjoni tal-fajl *.ipa skont l-informazzjoni speċifikata fil-manifest permezz ta' HTTPS.
Għalhekk, l-ewwel għandna bżonn niġġeneraw manifest ta 'installazzjoni (tip ta' fajl *.plist) bil-kmand:
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>
EOFKif tistgħu taraw, il-manifest fih kważi l-parametri kollha involuti fil-bini tal-applikazzjoni.
Verżjoni tal-applikazzjoni ($AppVersion) jistgħu jiġu ċċekkjati bil-kmand:
defaults read $ProjectDir/Info CFBundleVersion Parametru $ipaUrl fih link dirett biex tniżżel il-fajl *.ipa. Mis-seba' verżjoni tal-iOS, l-applikazzjoni trid tiġi installata permezz ta' HTTPS. Fit-tmien verżjoni, il-format tal-manifest inbidel ftit: blokki b'settings għall-ikoni tal-applikazzjoni bħal
<images>
<image>...</image>
</images>Għalhekk, biex tinstalla l-applikazzjoni, paġna HTML sempliċi b'rabta bħal din hija biżżejjed:
itms-services://?action=download-manifest&url=https://$ServerUrl/$ProjectName/$Instance/iOS/$AppVersion/manifest.plistGħall-bżonnijiet tad-dipartimenti tal-iżvilupp u l-ittestjar, Plarium ħoloq l-applikazzjoni tal-installazzjoni tal-bini tiegħu stess, li tagħtina:
- awtonomija u indipendenza,
- ċentralizzazzjoni tal-kontroll tal-aċċess u installazzjoni sigura tal-applikazzjonijiet permezz ta’ links “temporanji” maħluqa dinamikament,
- funzjonalità espansibbli (jiġifieri, it-tim ta 'żvilupp, jekk meħtieġ, jista' jintegra funzjonijiet neqsin f'applikazzjoni eżistenti).
Ittestjar
Issa se nitkellmu dwar l-ittestjar qabel ir-rilaxx tal-applikazzjoni bl-użu .
Il-kundizzjonijiet meħtieġa għat-tniżżil huma t-tip ta’ profil tal-firma tal-App Store u l-preżenza ta’ ċwievet API ġġenerati.
Hemm diversi modi biex tniżżel l-applikazzjoni:
- permezz Xcode (Organizzatur),
- permezz ta' altool,
- permezz ta 'Applikazzjoni Loader għal verżjonijiet eqdem ta' Xcode (issa Transporter).
Għat-tniżżil awtomatiku, jintuża altool, li għandu wkoll żewġ metodi ta 'awtorizzazzjoni:
- Password Speċifika għall-App,
- Ċavetta API.
Huwa preferibbli li tniżżel l-applikazzjoni billi tuża l-API Key.
Biex tikseb iċ-Ċavetta API, mur fuq u tiġġenera ċavetta. Minbarra ċ-ċavetta nnifisha fil-format *.p8, ikollna bżonn żewġ parametri: IssuerID u KeyID.

Sussegwentement, importa ċ-ċavetta mniżżla fis-server tal-bini:
mkdir -p ~/.appstoreconnect/private_keys
mv ~/Downloads/AuthKey_${KeyID}.p8 ~/.appstoreconnect/private_keys/Qabel ittella 'l-applikazzjoni għal TestFlight, għandek bżonn tivvalida l-applikazzjoni, nagħmlu dan bil-kmand:
xcrun altool
--validate-app
-t ios
-f $(find "$ProjectDir" -name "*.ipa")
--apiKey “$KeyID”
--apiIssuer “$IssuerID” Где apiKey и apiIssuer għandhom valuri tal-kamp mill-paġna tal-ġenerazzjoni taċ-ċavetta API.
Sussegwentement, mal-validazzjoni b'suċċess, aħna tagħbija l-applikazzjoni bil-kmand --upload-app bl-istess parametri.
L-applikazzjoni se tiġi ttestjata minn Apple fi żmien jum jew jumejn u mbagħad issir disponibbli għal testers esterni: dawn se jintbagħtu links bl-email għall-installazzjoni.
Mod ieħor biex tniżżel applikazzjoni permezz ta' altool huwa li tuża Password Speċifika għall-App.
Biex tikseb il-Password Speċifika għall-App trid tmur u iġġeneraha fit-taqsima tas-Sigurtà.

Sussegwentement, għandek toħloq rekord tas-server tal-bini f'Keychain b'din il-password. Mill-verżjoni 11 ta 'Xcode dan jista' jsir bil-kmand:
xcrun altool --store-password-in-keychain-item "Altool" -u "$DeveloperName" -p $AppPswdFejn:
$DeveloperName — l-isem tal-kont tal-iżviluppatur tal-iOS użat biex tidħol fis-servizzi Apple.
$AppPswd — Password Speċifika għall-App iġġenerata.
Sussegwentement, inġibu l-valur tal-parametru asc-fornitur u niċċekkjaw is-suċċess tal-importazzjoni tal-password bil-kmand:
xcrun altool --list-providers -u "$DeveloperName" -p "@keychain:Altool"Nieħdu l-output:
Provider listing:
- Long Name - - Short Name -
XXXXXXX XXXXXXXXXKif tistgħu taraw, il-valur tal-Isem Qasir meħtieġ (asc-provider) jikkoinċidi mal-parametru $TeamID li użajna meta bnejna l-applikazzjoni.
Biex tivvalida u tagħbija l-applikazzjoni f'TestFlight, uża l-kmand:
xcrun altool
--(validate|upload)-app
-f $(find "$ProjectDir" -name "*.ipa")
-u "$DeveloperName"
-p "@keychain:Altool" Bħala valur tal-parametru -p tista 'tieħu l-valur $AppPswd f'forma mhux kriptata (espliċita).
Madankollu, kif diġà ssemma, mil-lat tal-prestazzjoni, huwa aħjar li tagħżel API Key għall-awtorizzazzjoni altool, peress li verżjonijiet differenti ta 'Xcode għandhom ċerti problemi ("ma tarax" Keychain, żbalji ta' awtorizzazzjoni waqt it-tlugħ, eċċ.).
Dak kollu, fil-fatt. Nixtieq lil kull min hu involut bini ta' suċċess u rilaxxi mingħajr problemi fl-App Store.
Sors: www.habr.com
