Funzioni di custruisce è furnisce l'applicazioni iOS

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.

Funzioni di custruisce è furnisce l'applicazioni iOS

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:

  • contu di sviluppatore;
  • un dispositivu basatu in macOS chì agisce cum'è un servitore di custruzzione;
  • generatu certificatu di sviluppatore, chì serà ancu utilizatu per firmà l'applicazione;
  • applicazione creatu cun unicu ID (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);
  • prufilu firme di l'applicazione.

Un certificatu di sviluppatore deve esse generatu via Keychain in qualsiasi dispositivu macOS. U tipu di certificatu hè assai impurtante. Sicondu l'ambiente di l'applicazione (Dev, QA, Staging, Production) serà diversu (Sviluppu o Distribuzione), cum'è u tipu di prufilu di firma di l'applicazione.

Tipi principali di profili:

  • Sviluppu - destinatu à firmà l'applicazione di u squadra di sviluppu, un certificatu di Sviluppu hè utilizatu (nome di tipu iPhone Developer: XXXXX);
  • Ad Hoc - destinatu à firmà una applicazione di prova è verificazione interna da u dipartimentu QA, u certificatu di Distribuzione di u sviluppatore hè utilizatu (nome di tipu 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 lista di dispositivi, 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.

Funzioni di custruisce è furnisce l'applicazioni iOS

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 - u nome di u cuntu di sviluppatore, chì pò esse verificatu in Keychain (Sviluppatore iPhone: XXXX XXXXXXX, senza TeamID in parentesi).

Funzioni di custruisce è furnisce l'applicazioni iOS

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 di dece cifre in parentesi dopu u nome di u sviluppatore, esempiu: Sviluppatore iPhone: …… (XXXXXXXXXX); pò esse verificatu in Keychain.

Dopu, usendu u cumandamentu di l'esportazione, uttene u schedariu *.ipa necessariu:

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

Infurmazioni 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:

  1. Riceve u manifestu di l'installazione di l'applicazione attraversu u Serviziu di Articuli.
  2. 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>
EOF

Comu 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.plist

Per 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 TestFlight.

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 à a lea è generà una chjave. In più di a chjave stessu in u formatu *.p8, avemu bisognu di dui parametri: IssuerID è KeyID.

Funzioni di custruisce è furnisce l'applicazioni iOS

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à à a lea è generà in a sezione Sicurezza.

Funzioni di custruisce è furnisce l'applicazioni iOS

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 $AppPswd

Dove:

$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        XXXXXXXXX

Comu 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

Add a comment