In questu articulu, spartemu l'esperienza di l'assemblea è di furnisce l'applicazioni iOS à l'utilizatori, chì u studio Plarium Krasnodar hà accumulatu in u prucessu di debugging CI / CD.

A preparazione di
Ogni persona chì hè in un modu o un altru implicatu in u sviluppu di l'applicazioni per i dispositi Apple hà digià apprezzatu a cunvenzione cuntruversa di l'infrastruttura. E difficultà si trovanu in ogni locu: da u menu di u prufilu di u sviluppatore à l'arnesi di debug è di custruisce.
Ci sò assai articuli nantu à i "basamenti" in Internet, cusì avemu da pruvà à mette in risaltu u principale. Eccu ciò chì avete bisognu per custruisce a vostra applicazione cù successu:
- ;
- устройство на базе macOS, выступающее в роли билд-сервера;
- generatu , chì serà ancu utilizatu per firmà l'applicazione;
- applicazione creatu cun unicu (l'impurtanza di u Bundle Identifier deve esse nutatu, perchè l'usu di l'ID wildcard rende impussibile di utilizà parechje funzioni di l'applicazione, per esempiu: Domains Associati, Push Notifications, Apple Sign In è altri);
- firme di l'applicazione.
Сертификат разработчика следует сгенерировать через Keychain на любом устройстве на базе macOS. Очень важным является тип сертификата. В зависимости от среды приложения (Dev, QA, Staging, Production) он будет различаться (Development или Distribution), так же как и тип профиля подписи приложения.
Tipi principali di profili:
- Development — предназначен для подписи приложения команды разработчиков, используется Development-сертификат (имя вида iPhone Developer: XXXXX);
- Ad Hoc — предназначен для подписи тестового приложения и внутренней проверки QA-отделом, используется Distribution-сертификат разработчика (имя вида iPhone Distribution: XXXXX);
- App Store - liberate a compilazione per a prova esterna via TestFlight è caricate in l'App Store, u certificatu di Distribuzione di u sviluppatore hè utilizatu.
Quandu generà Profili di Sviluppu è Ad Hoc, hè ancu indicatu , nantu à quale pudete installà una custruzzione, chì permette di limità più l'accessu per l'utilizatori. Ùn ci hè micca una lista di i dispositi in u prufilu App Store, postu chì u cuntrollu di l'accessu durante a prova beta chjusa hè trattatu da TestFlight, chì serà discututu dopu.
Per a chiarezza, pudete presentà u prufilu di u sviluppatore in a forma di una tabella sottu. Questu facenu più faciule per capiscenu quali paràmetri avemu bisognu per l'assemblea è da induve ottene.

Assemblea
Per fà più faciule per separà l'assemblee per prughjettu è ambiente, usemu nomi di prufilu cum'è ${ProjectName}_${Instance}, vale à dì, nome di prughjettu + istanza (dipende da l'ambiente di l'applicazione: Dev, QA, GD, Staging, Live, etc.).
Quandu hè impurtatu à u servitore di custruzzione, u prufilu cambia u so nome à un ID unicu è hè spustatu à u cartulare /Users/$Username/Library/MobileDevice/Provisioning Profiles (Induva $Username currisponde à u nome di u contu d'utilizatore di u servitore di creazione).
Ci hè duie manere di custruisce un schedariu *.ipa - legatu (PackageApplication) è mudernu (via creazione è esportazione XcAchive). U primu metudu hè cunsideratu obsoletu, postu chì da a versione 8.3 u modulu di imballaggio di u schedariu app hè statu eliminatu da a distribuzione Xcode. Per aduprà, avete bisognu di copià u modulu da u vechju Xcode (versione 8.2 è precedente) à u cartulare:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/
E poi eseguite u cumandamentu:
chmod +x /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/*Dopu avete bisognu di cullà u schedariu *.app di l'applicazione:
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
Dove:
-workspace - percorso à u schedariu di prughjettu.
-scheme - u schema utilizatu, specificatu in u prugettu.
-derivedDataPath - percorso per scaricà l'applicazione assemblata (*.app).
CODE_SIGN_IDENTITY — имя аккаунта разработчика, которое можно проверить в Keychain (iPhone Developer: XXXX XXXXXXX, без TeamID в скобках).

PROVISIONING_PROFILE - ID di prufilu per firmà l'applicazione, chì pò esse ottenuta cù u cumandimu:
cd "/Users/$Username/Library/MobileDevice/Provisioning Profiles/" && find *.mobileprovision -type f | xargs grep -li ">${ProjectName}_${Instance}<" | sed -e 's/.mobileprovision//' Se l'applicazione usa un prufilu supplementu (per esempiu, per Push Notifications), invece di PROVISIONING_PROFILE indicà:
APP_PROFILE=”$AppProfile”
EXTENSION_PROFILE=”$ExtProfile” In seguitu, u schedariu *.app risultatu deve esse imballatu in *.ipa. Per fà questu, pudete aduprà un cumandamentu cum'è:
/usr/bin/xcrun --sdk iphoneos PackageApplication
-v $(find "$ProjectDir/build/Build/Products/Release-iphoneos" -name "*.app")
-o "$ProjectDir/$ProjectName_$Instance.ipa"Tuttavia, stu mètudu hè cunsideratu obsolet da u puntu di vista di Apple. Hè pertinente per ottene *.ipa esportendu da l'archiviu di l'applicazione.
Prima avete bisognu di cullà l'archiviu cù u cumandimu:
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 A diffarenza si trova in u metudu di assemblea è l'opzioni SYNCHRONOUS_SYMBOL_PROCESSING, chì disattiveghja u scaricamentu di u simbulu à u tempu di creazione.
Dopu avemu bisognu di generà un schedariu cù i paràmetri di l'esportazione:
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
Dove:
$Method - metudu di consegna, currisponde à u tipu di prufilu di firma di l'applicazione, vale à dì, per u Sviluppu u valore serà u sviluppu, per Ad Hoc - ad-hoc, è per l'App Store - app-store.
$BundleID - ID di l'applicazione, chì hè specificatu in i paràmetri di l'applicazione. Pudete cuntrollà cù u cumandimu:
defaults read $ProjectDir/Info CFBundleIdentifier $DevAccName и $ProfileId - paràmetri di u nome di u sviluppatore è di l'ID di u prufilu di firma chì sò stati utilizati prima è devenu cuncordà i valori in i paràmetri di esportazione.
$TeamID — десятизначный ID в скобках после имени разработчика, пример: iPhone Developer: …… (XXXXXXXXXX); можно проверить в Keychain.
Dopu, usendu u cumandamentu di l'esportazione, uttene u schedariu *.ipa necessariu:
xcodebuild
-exportArchive
-archivePath $ProjectDir/build/$ProjectName.xcarchive
-exportPath $ProjectDir
-exportOptionsPlist $ExportSettingsInfurmazioni in trasportu
Avà u schedariu cullatu deve esse mandatu à l'utilizatore finale, vale à dì, installatu nantu à u dispusitivu.
Ci hè parechje servizii per a distribuzione di Sviluppu è Ad Hoc builds, cum'è HockeyApp, AppBlade è altri, ma in questu articulu parlemu di un servitore standalone per a distribuzione di applicazioni.
L'installazione di l'applicazione per iOS si svolge in 2 fasi:
- Riceve u manifestu di l'installazione di l'applicazione attraversu u Serviziu di Articuli.
- A stallazione di u schedariu *.ipa secondu l'infurmazioni specificate in u manifestu via HTTPS.
Cusì, avemu prima bisognu di generà un manifestu di installazione (file type *.plist) cù u cumandimu:
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>
EOFComu pudete vede, u manifestu cuntene quasi tutti i paràmetri implicati in a custruzione di l'applicazione.
Versione di l'applicazione ($AppVersion) pò esse verificatu cù u cumandimu:
defaults read $ProjectDir/Info CFBundleVersion Parameter $ipaUrl cuntene un ligame direttu per scaricà u schedariu *.ipa. Da a settima versione di iOS, l'applicazione deve esse installata via HTTPS. In l'ottava versione, u furmatu di u manifestu hà cambiatu pocu: blocchi cù paràmetri per l'icone di l'applicazione cum'è
<images>
<image>...</image>
</images>Cusì, per installà l'applicazione, basta una pagina HTML simplice cù un ligame cum'è questu:
itms-services://?action=download-manifest&url=https://$ServerUrl/$ProjectName/$Instance/iOS/$AppVersion/manifest.plistPer i bisogni di i dipartimenti di sviluppu è teste, Plarium hà creatu a so propria applicazione di stallazione di custruzzione, chì ci dà:
- l'autonomia è l'indipendenza,
- centralizazione di u cuntrollu di l'accessu è l'installazione sicura di l'applicazioni per mezu di ligami "temporanei" creati dinamicamente,
- funziunalità espansibile (vale à dì, a squadra di sviluppu, se ne necessariu, pò integrà e funzioni mancanti in una applicazione esistente).
Prucessioni
Avà parlemu di a prova di pre-release di l'applicazione utilizendu .
I cundizioni necessarii per u scaricamentu sò u tipu di prufilu di firma di l'App Store è a presenza di e chjave API generate.
Ci hè parechje manere di scaricà l'applicazione:
- via Xcode (Organizzatore),
- via altool,
- via Application Loader per versioni più vechje di Xcode (ora Transporter).
Per u scaricamentu automaticu, hè utilizatu altool, chì hà ancu dui metudi d'autorizazione:
- Password specifica per l'app,
- Chiave API.
Hè preferibile scaricà l'applicazione cù a chjave API.
Per uttene a chjave API, andate à è generà una chjave. In più di a chjave stessu in u formatu *.p8, avemu bisognu di dui parametri: IssuerID è KeyID.

In seguitu, impurtate a chjave scaricata à u servitore di custruzzione:
mkdir -p ~/.appstoreconnect/private_keys
mv ~/Downloads/AuthKey_${KeyID}.p8 ~/.appstoreconnect/private_keys/Prima di carica l'applicazione in TestFlight, avete bisognu di cunvalidà l'applicazione, facemu questu cù u cumandimu:
xcrun altool
--validate-app
-t ios
-f $(find "$ProjectDir" -name "*.ipa")
--apiKey “$KeyID”
--apiIssuer “$IssuerID” Induve apiKey и apiIssuer avè valori di campu da a pagina di generazione di chjave API.
Dopu, dopu a validazione successu, carchemu l'applicazione cù u cumandamentu --upload-app cù i stessi paràmetri.
L'applicazione serà pruvata da Apple in un o dui ghjorni è diventeranu dopu dispunibuli per i testatori esterni: saranu ligami per e-mail per a stallazione.
Un altru modu per scaricà una applicazione attraversu altool hè di utilizà una password specifica per l'app.
Per ottene u Password-Specific App vi tocca à andà à è generà in a sezione Sicurezza.

Dopu, duvete creà un registru di u servitore di custruzzione in Keychain cù questa password. Da a versione 11 di Xcode, questu pò esse fattu cù u cumandimu:
xcrun altool --store-password-in-keychain-item "Altool" -u "$DeveloperName" -p $AppPswdDove:
$DeveloperName - u nome di u contu di sviluppatore iOS utilizatu per accede à i servizii Apple.
$AppPswd - generatu Password App-Specific.
Dopu, avemu u valore di u paràmetru asc-provider è verificate u successu di l'importazione di password cù u cumandimu:
xcrun altool --list-providers -u "$DeveloperName" -p "@keychain:Altool"Avemu l'output:
Provider listing:
- Long Name - - Short Name -
XXXXXXX XXXXXXXXXComu pudete vede, u valore di u nome breve necessariu (asc-provider) coincide cù u paràmetru $TeamID chì avemu usatu quandu custruisce l'applicazione.
Per validà è carica l'applicazione in TestFlight, utilizate u cumandimu:
xcrun altool
--(validate|upload)-app
-f $(find "$ProjectDir" -name "*.ipa")
-u "$DeveloperName"
-p "@keychain:Altool" Cum'è un valore di paràmetru -p pudete piglià u valore $AppPswd in forma non criptata (esplicita).
Tuttavia, cum'è digià dettu, da u puntu di vista di u funziunamentu, hè megliu di sceglie API Key per l'autorizazione altool, postu chì e diverse versioni di Xcode anu certi prublemi ("ùn vede" Keychain, errori d'autorizazione durante u upload, etc.).
Hè tuttu, in realtà. Vogliu chì tutti quelli chì participanu à custruzzioni riesciuti è versioni senza prublemi in l'App Store.
Source: www.habr.com
