Karatteristiċi tal-bini u l-kunsinna tal-applikazzjonijiet tal-iOS

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.

Karatteristiċi tal-bini u l-kunsinna tal-applikazzjonijiet tal-iOS

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:

  • kont tal-iżviluppatur;
  • apparat ibbażat fuq macOS li jaġixxi bħala server tal-bini;
  • iġġenerat ċertifikat tal-iżviluppatur, li se tintuża aktar biex tiffirma l-applikazzjoni;
  • applikazzjoni maħluqa bl uniku ID (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);
  • profil firem tal-applikazzjoni.

Ċertifikat ta 'żviluppatur irid jiġi ġġenerat permezz ta' Keychain fuq kwalunkwe apparat macOS. It-tip ta 'ċertifikat huwa importanti ħafna. Skont l-ambjent tal-applikazzjoni (Dev, QA, Staging, Production) se jkun differenti (Żvilupp jew Distribuzzjoni), kif ukoll it-tip ta 'profil tal-firma tal-applikazzjoni.

Tipi ewlenin ta 'profili:

  • Żvilupp - maħsub biex jiffirma l-applikazzjoni tat-tim ta 'żvilupp, jintuża ċertifikat ta' Żvilupp (isem tat-tip iPhone Developer: XXXXX);
  • Ad Hoc - maħsub 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 Distribution: 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 lista tal-apparat, 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.

Karatteristiċi tal-bini u l-kunsinna tal-applikazzjonijiet tal-iOS

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 Developer: XXXX XXXXXXX, mingħajr TeamID fil-parentesi).

Karatteristiċi tal-bini u l-kunsinna tal-applikazzjonijiet tal-iOS

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 b’għaxar ċifri fil-parentesi wara l-isem tal-iżviluppatur, eżempju: Żviluppatur tal-iPhone: …… (XXXXXXXXXX); jistgħu jiġu ċċekkjati 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 $ExportSettings

Kunsinna

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:

  1. Jirċievi l-manifest tal-installazzjoni tal-applikazzjoni permezz tas-Servizz tal-Oġġetti.
  2. 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>
EOF

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

Għ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 titjira tat-test.

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 rabta u tiġġenera ċavetta. Minbarra ċ-ċavetta nnifisha fil-format *.p8, ikollna bżonn żewġ parametri: IssuerID u KeyID.

Karatteristiċi tal-bini u l-kunsinna tal-applikazzjonijiet tal-iOS

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 rabta u iġġeneraha fit-taqsima tas-Sigurtà.

Karatteristiċi tal-bini u l-kunsinna tal-applikazzjonijiet tal-iOS

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

Fejn:

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

Kif 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

Żid kumment