Trajtoj de konstruado kaj liverado de iOS-aplikoj

En ĉi tiu artikolo, ni dividas la sperton pri muntado kaj liverado de iOS-aplikoj al uzantoj, kiujn la studio Plarium Krasnodar akumulis en la procezo de elpurigado de CI/KD.

Trajtoj de konstruado kaj liverado de iOS-aplikoj

Trejnado

Ĉiu persono, kiu estas iel aŭ alia implikita en la disvolviĝo de aplikoj por Apple-aparatoj, jam aprezis la polemikan oportunecon de la infrastrukturo. Malfacilaĵoj troviĝas ĉie: de la menuo de la profila programisto ĝis la iloj pri sencimigo kaj konstruo.

Estas multaj artikoloj pri la "bazoj" en la Interreto, do ni provos reliefigi la ĉefan aferon. Jen kion vi bezonas por konstrui vian aplikaĵon sukcese:

  • konto de programisto;
  • macOS-bazita aparato aganta kiel konstruservilo;
  • generita atestilo pri ellaboranto, kiu estos plu uzata por subskribi la aplikaĵon;
  • kreita aplikaĵo kun unika ID (la graveco de la Bundle Identifier devas esti notita, ĉar la uzo de ĵokera ID malebligas uzi multajn funkciojn de la aplikaĵo, ekzemple: Asociitaj Domajnoj, Push Notifications, Apple Sign In kaj aliaj);
  • profilon subskriboj de aplikaĵo.

Atestilo de programisto devas esti generita per Ŝlosilĉeno sur iu ajn macOS-aparato. La speco de atestilo estas tre grava. Depende de la aplika medio (Dev, QA, Staging, Production) ĝi malsamos (Evoluo aŭ Distribuo), same kiel la speco de aplika subskriba profilo.

Ĉefaj specoj de profiloj:

  • Disvolviĝo - destinita por subskribi la aplikaĵon de la disvolva teamo, estas uzata Disvolva atestilo (tipo nomo iPhone-Ellaboranto: XXXXX);
  • Ad Hoc - destinita por subskribi testan aplikaĵon kaj internan konfirmon de la departemento QA, la atestilo de Distribuo de la programisto estas uzata (tipo nomo iPhone Distribuo: XXXXX);
  • App Store - liberigu konstruon por ekstera testado per TestFlight kaj alŝutado al la App Store, la Distribua atestilo de la programisto estas uzata.

Kiam oni generas Evoluajn kaj Ad Hoc-profilojn, ĝi ankaŭ estas indikita aparata listo, sur kiu vi povas instali konstruaĵon, kiu permesas vin plue limigi aliron por uzantoj. Ne estas listo de aparatoj en la App Store-profilo, ĉar alirkontrolo dum fermita beta-testado estas pritraktata de TestFlight, kiu estos diskutita poste.

Por klareco, vi povas prezenti la profilon de la programisto en la formo de tabelo sube. Ĉi tio faciligas kompreni kiajn parametrojn ni bezonas por kunigo kaj de kie akiri ilin.

Trajtoj de konstruado kaj liverado de iOS-aplikoj

Asembleo

Por faciligi apartigi arojn laŭ projekto kaj medio, ni uzas profilnomojn kiel ${ProjectName}_${Instance}, tio estas, projektnomo + petskribo (dependas de la aplika medio: Dev, QA, GD, Staging, Live, ktp).

Kiam estas importita al la konstruservilo, la profilo ŝanĝas sian nomon al unika identigilo kaj estas movita al la dosierujo /Users/$Username/Library/MobileDevice/Provisioning Profiles (kie $Username respondas al la uzantkontonomo de la konstruservilo).

Estas du manieroj konstrui *.ipa dosieron - heredaĵo (PackageApplication) kaj moderna (per XcAchive-kreado kaj eksporto). La unua metodo estas konsiderata malnoviĝinta, ĉar ekde versio 8.3 la aplikaĵa dosiera pakmodulo estis forigita de la Xcode-distribuo. Por uzi ĝin, vi devas kopii la modulon de la malnova Xcode (versio 8.2 kaj pli frue) al la dosierujo:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

Kaj poste rulu la komandon:

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

Poste vi devas kolekti la *.app-dosieron de la aplikaĵo:

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

Kie:

-workspace — vojo al la projektdosiero.

-scheme — la skemo uzata, specifita en la projekto.

-derivedDataPath — vojo por elŝuti la kunmetitan aplikaĵon (*.app).

CODE_SIGN_IDENTITY — la nomo de la programisto, kiu povas esti kontrolita en Ŝlosilĉeno (iPhone-Programisto: XXXX XXXXXXX, sen TeamID inter krampoj).

Trajtoj de konstruado kaj liverado de iOS-aplikoj

PROVISIONING_PROFILE — Profila ID por subskribi la aplikaĵon, kiu povas esti akirita per la komando:

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

Se la aplikaĵo uzas kroman profilon (ekzemple por Puŝaj Sciigoj), tiam anstataŭ PROVISIONING_PROFILE indiki:

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

Poste, la rezulta *.app-dosiero estu pakita en *.ipa. Por fari tion, vi povas uzi komandon kiel:

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

Tamen, ĉi tiu metodo estas konsiderata malnoviĝinta el la vidpunkto de Apple. Estas grave akiri *.ipa eksportante el la aplikaĵo-arkivo.

Unue vi devas kolekti la arkivon per la komando:

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

La diferencoj kuŝas en la kunigmetodo kaj opcioj SYNCHRONOUS_SYMBOL_PROCESSING, kiu malŝaltas simbolon malŝarĝon je konstrua tempo.

Poste ni devas generi dosieron kun eksportaj agordoj:

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

Kie:

$Method — livera metodo, respondas al la aplikaĵa subskriba profilotipo, tio estas, por Evoluo la valoro estos evoluo, por Ad Hoc - ad-hoc, kaj por App Store - app-store.

$BundleID — Aplika ID, kiu estas specifita en la aplikaĵaj agordoj. Vi povas kontroli per la komando:

defaults read $ProjectDir/Info CFBundleIdentifier

$DevAccName и $ProfileId - agordoj de la nomo de programisto kaj subskriba profila ID, kiuj antaŭe estis uzataj kaj devas kongrui kun la valoroj en la eksportaj agordoj.

$TeamID — dekcifera identigilo inter krampoj post la nomo de la programisto, ekzemplo: IPhone-Programisto: …… (XXXXXXXXXX); povas esti kontrolita en Ŝlosilĉeno.

Poste, uzante la eksportan komandon, ni akiras la necesan dosieron *.ipa:

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

Sendado info

Nun la kolektita dosiero devas esti transdonita al la fina uzanto, tio estas, instalita sur la aparato.

Estas multaj servoj por distribuado de Disvolvado kaj Ad Hoc-konstruaĵoj, kiel HockeyApp, AppBlade kaj aliaj, sed en ĉi tiu artikolo ni parolos pri memstara servilo por distribuado de aplikaĵoj.

Instalado de la aplikaĵo por iOS okazas en 2 etapoj:

  1. Ricevante la manifeston pri instalado de aplikaĵo per la Eroj-Servo.
  2. Instalado de la dosiero *.ipa laŭ la informoj specifitaj en la manifesto per HTTPS.

Tiel, ni unue devas generi instalan manifeston (dosiertipo *.plist) per la komando:

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

Kiel vi povas vidi, la manifesto enhavas preskaŭ ĉiujn parametrojn implikitajn en konstruado de la aplikaĵo.

Aplikversio ($AppVersion) povas esti kontrolita per la komando:

defaults read $ProjectDir/Info CFBundleVersion

Parametro $ipaUrl enhavas rektan ligilon por elŝuti la dosieron *.ipa. De la sepa versio de iOS, la aplikaĵo devas esti instalita per HTTPS. En la oka versio, la formato de la manifesto iomete ŝanĝiĝis: blokoj kun agordoj por aplikaj ikonoj kiel

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

Tiel, por instali la aplikaĵon, sufiĉas simpla HTML-paĝo kun ligilo tia:

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

Por la bezonoj de la fakoj pri disvolviĝo kaj testado, Plarium kreis sian propran konstruan instalan aplikaĵon, kiu donas al ni:

  • aŭtonomeco kaj sendependeco,
  • centraligo de alirkontrolo kaj sekura instalado de aplikaĵoj per "provizoraj" dinamike kreitaj ligiloj,
  • disetendebla funkcieco (tio estas, la evolua teamo, se necese, povas integri mankantajn funkciojn en ekzistantan aplikaĵon).

Testado

Nun ni parolos pri antaŭ-liberiga testado de la aplikaĵo uzante TestFlight.

Bezonataj kondiĉoj por elŝuto estas la speco de subskriba profilo de App Store kaj la ĉeesto de generitaj API-ŝlosiloj.

Estas pluraj manieroj elŝuti la aplikaĵon:

  • per Xcode (Organizinto),
  • per altool,
  • per Application Loader por pli malnovaj versioj de Xcode (nun Transporter).

Por aŭtomata elŝutado, altool estas uzata, kiu ankaŭ havas du rajtigajn metodojn:

  • Apliko-Specifika Pasvorto,
  • API Ŝlosilo.

Estas preferinde elŝuti la aplikaĵon per la API-Ŝlosilo.

Por akiri la API-Ŝlosilon, iru al ligilo kaj generi ŝlosilon. Krom la ŝlosilo mem en formato *.p8, ni bezonos du parametrojn: IssuerID kaj KeyID.

Trajtoj de konstruado kaj liverado de iOS-aplikoj

Poste, importu la elŝutitan ŝlosilon al la konstruservilo:

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

Antaŭ alŝuti la aplikaĵon al TestFlight, vi devas validigi la aplikaĵon, ni faras tion per la komando:

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

Kie apiKey и apiIssuer havas kampajn valorojn de la paĝo pri API-ŝlosila generacio.

Poste, post sukcesa validigo, ni ŝarĝas la aplikaĵon per la komando --upload-app kun la samaj parametroj.

La aplikaĵo estos provita de Apple ene de unu aŭ du tagoj kaj tiam estos disponebla por eksteraj testantoj: al ili estos retpoŝtaj ligiloj por instalado.

Alia maniero elŝuti aplikaĵon per altool estas uzi App-Specifika Pasvorto.

Por akiri la App-Specifikan Pasvorton, vi devas iri al ligilo kaj generu ĝin en la sekcio Sekureco.

Trajtoj de konstruado kaj liverado de iOS-aplikoj

Poste, vi devus krei konstruan servilon rekordon en Keychain kun ĉi tiu pasvorto. De la versio 11 de Xcode ĉi tio povas esti farita per la komando:

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

Kie:

$DeveloperName — la nomo de la iOS-programkonto uzata por ensaluti al Apple-servoj.

$AppPswd — generita App-Specifika Pasvorto.

Poste, ni ricevas la valoron de la parametro asc-provider kaj kontrolas la sukceson de la pasvorta importo per la komando:

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

Ni ricevas la eligon:

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

Kiel vi povas vidi, la bezonata Short Name-valoro (asc-provider) koincidas kun la parametro $TeamID, kiun ni uzis dum konstruado de la aplikaĵo.

Por validigi kaj ŝargi la aplikaĵon en TestFlight, uzu la komandon:

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

Kiel parametrovaloro -p vi povas preni la valoron $AppPswd en neĉifrita (eksplicita) formo.

Tamen, kiel jam menciite, el la vidpunkto de agado, estas pli bone elekti API-Ŝlosilon por altool-rajtigo, ĉar malsamaj versioj de Xcode havas iujn problemojn ("ne vidas" Ŝlosilĉenon, rajtigajn erarojn dum alŝuto, ktp.).

Tio estas ĉio, fakte. Mi deziras, ke ĉiuj implikitaj sukcesaj konstruoj kaj senpagaj eldonoj en la App Store.

fonto: www.habr.com

Aldoni komenton