iOS programų kūrimo ir pristatymo ypatybės

Šiame straipsnyje dalinamės iOS programų surinkimo ir pateikimo vartotojams patirtimi, kurią Plarium Krasnodar studija sukaupė derindama CI/CD.

iOS programų kūrimo ir pristatymo ypatybės

Mokymai

Kiekvienas žmogus, vienaip ar kitaip susijęs su Apple įrenginių aplikacijų kūrimu, jau įvertino prieštaringą infrastruktūros patogumą. Sunkumai randami visur: nuo kūrėjo profilio meniu iki derinimo ir kūrimo įrankių.

Internete yra daugybė straipsnių apie „pagrindus“, todėl pabandysime pabrėžti pagrindinį dalyką. Štai ko jums reikia norint sėkmingai sukurti programą:

  • kūrėjo paskyra;
  • „macOS“ pagrindu veikiantis įrenginys, veikiantis kaip kūrimo serveris;
  • sukurtas kūrėjo sertifikatas, kuris toliau bus naudojamas paraiškai pasirašyti;
  • sukurta programa su unikalia ID (atkreiptinas dėmesys į Bundle Identifier svarbą, nes naudojant pakaitos ID neįmanoma naudotis daugeliu aplikacijos funkcijų, pvz.: Associated Domains, Push Notifications, Apple Sign In ir kt.);
  • profilis paraiškos parašai.

Kūrėjo sertifikatas turi būti sugeneruotas naudojant „Keychain“ bet kuriame „MacOS“ įrenginyje. Labai svarbu yra sertifikato tipas. Priklausomai nuo taikomosios aplinkos (kūrimas, kokybės užtikrinimas, tarpininkavimas, gamyba), ji skirsis (kūrimas arba platinimas), taip pat programos parašo profilio tipas.

Pagrindiniai profilių tipai:

  • Kūrimas – skirtas kūrimo komandos paraiškai pasirašyti, naudojamas Kūrimo sertifikatas (tipo pavadinimas iPhone Developer: XXXXX);
  • Ad Hoc – skirtas pasirašyti bandomąją aplikaciją ir vidinį kokybės užtikrinimo skyriaus patikrinimą, naudojamas kūrėjo Distribution sertifikatas (tipo pavadinimas iPhone Distribution: XXXXX);
  • „App Store“ – išleista versija išoriniam testavimui per „TestFlight“ ir įkėlimui į „App Store“, naudojamas kūrėjo platinimo sertifikatas.

Taip pat nurodoma kuriant kūrimo ir ad hoc profilius įrenginių sąrašą, kuriame galite įdiegti versiją, kuri leidžia dar labiau apriboti vartotojų prieigą. „App Store“ profilyje nėra įrenginių sąrašo, nes prieigos kontrolę uždaro beta versijos testavimo metu tvarko „TestFlight“, kuris bus aptartas vėliau.

Aiškumo dėlei galite pateikti kūrėjo profilį žemiau esančios lentelės pavidalu. Taip lengviau suprasti, kokių parametrų mums reikia surinkimui ir iš kur juos gauti.

iOS programų kūrimo ir pristatymo ypatybės

Asamblėja

Kad būtų lengviau atskirti mazgus pagal projektą ir aplinką, naudojame profilių pavadinimus, pvz ${ProjectName}_${Instance}, tai yra projekto pavadinimas + egzempliorius (priklauso nuo taikomosios aplinkos: Dev, QA, GD, Staging, Live ir pan.).

Kai importuojamas į kūrimo serverį, profilis pakeičia pavadinimą į unikalų ID ir perkeliamas į aplanką /Users/$Username/Library/MobileDevice/Provisioning Profiles (Kur $Username atitinka kūrimo serverio vartotojo abonemento pavadinimą).

Yra du būdai, kaip sukurti *.ipa failą – senas (PackageApplication) ir modernus (per XcAchive kūrimą ir eksportavimą). Pirmasis metodas laikomas pasenusiu, nes nuo 8.3 versijos programos failų pakavimo modulis buvo pašalintas iš Xcode platinimo. Norėdami jį naudoti, turite nukopijuoti modulį iš senojo Xcode (8.2 ir senesnės versijos) į aplanką:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

Ir tada paleiskite komandą:

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

Tada turite surinkti programos *.app failą:

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

Kur:

-workspace - kelias į projekto failą.

-scheme — projekte nurodyta naudojama schema.

-derivedDataPath — kelias, kaip atsisiųsti surinktą programą (*.app).

CODE_SIGN_IDENTITY — kūrėjo paskyros pavadinimas, kurį galima patvirtinti „Keychain“ („iPhone“ kūrėjas: XXXX XXXXXXX, be TeamID skliausteliuose).

iOS programų kūrimo ir pristatymo ypatybės

PROVISIONING_PROFILE — Paraiškos pasirašymo profilio ID, kurį galima gauti naudojant komandą:

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

Jei programa naudoja papildomą profilį (pavyzdžiui, tiesioginiams pranešimams), tada vietoj PROVISIONING_PROFILE nurodyti:

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

Tada gautas *.app failas turėtų būti supakuotas į *.ipa. Norėdami tai padaryti, galite naudoti tokią komandą:

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

Tačiau šis metodas „Apple“ požiūriu laikomas pasenusiu. Svarbu gauti *.ipa eksportuojant iš programų archyvo.

Pirmiausia turite surinkti archyvą naudodami komandą:

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

Skirtumai slypi surinkimo būdu ir pasirinkimuose SYNCHRONOUS_SYMBOL_PROCESSING, kuri išjungia simbolių iškrovimą kūrimo metu.

Toliau turime sugeneruoti failą su eksporto nustatymais:

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

Kur:

$Method — pristatymo būdas atitinka programos parašo profilio tipą, ty plėtrai reikšmė bus plėtra, Ad Hoc – ad-hoc, o App Store – programų parduotuvė.

$BundleID — Programos ID, kuris nurodytas programos nustatymuose. Galite patikrinti naudodami komandą:

defaults read $ProjectDir/Info CFBundleIdentifier

$DevAccName и $ProfileId — kūrėjo vardo ir parašo profilio ID nustatymai, kurie buvo naudojami anksčiau ir turi atitikti eksporto nustatymų reikšmes.

$TeamID — dešimties skaitmenų ID skliausteliuose po kūrėjo vardo, pavyzdžiui: iPhone Developer: …… (XXXXXXXXXX); galima patikrinti Keychain.

Tada, naudodami eksporto komandą, gauname reikiamą *.ipa failą:

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

Pristatymas

Dabar surinktas failas turi būti pristatytas galutiniam vartotojui, tai yra, įdiegtas įrenginyje.

Yra daug paslaugų, skirtų „Development“ ir „Ad Hoc“ versijų platinimui, pavyzdžiui, „HockeyApp“, „AppBlade“ ir kt., tačiau šiame straipsnyje kalbėsime apie atskirą serverį, skirtą programoms platinti.

Programos iOS diegimas vyksta 2 etapais:

  1. Programos diegimo aprašo gavimas per elementų tarnybą.
  2. *.ipa failo įdiegimas pagal manifeste nurodytą informaciją per HTTPS.

Taigi pirmiausia turime sugeneruoti diegimo aprašą (failo tipas *.plist) su komanda:

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

Kaip matote, manifeste yra beveik visi parametrai, susiję su programos kūrimu.

Programos versija ($AppVersion) galima patikrinti naudojant komandą:

defaults read $ProjectDir/Info CFBundleVersion

Parametras $ipaUrl yra tiesioginė nuoroda į *.ipa failo atsisiuntimą. Nuo septintosios iOS versijos programa turi būti įdiegta per HTTPS. Aštuntoje versijoje manifesto formatas šiek tiek pasikeitė: blokai su programų piktogramų nustatymais, pvz

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

Taigi, norint įdiegti programą, pakanka paprasto HTML puslapio su tokia nuoroda:

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

Kūrimo ir testavimo skyrių poreikiams „Plarium“ sukūrė savo „build“ diegimo programą, kuri suteikia mums:

  • savarankiškumas ir nepriklausomybė,
  • prieigos kontrolės centralizavimas ir saugus programų diegimas naudojant „laikinas“ dinamiškai sukurtas nuorodas,
  • plečiamas funkcionalumas (tai yra, kūrimo komanda, jei reikia, gali integruoti trūkstamas funkcijas į esamą programą).

Bandymai

Dabar kalbėsime apie programos prieš išleidimą testavimą naudojant TestFlight.

Būtinos atsisiuntimo sąlygos yra „App Store“ parašo profilio tipas ir sugeneruotų API raktų buvimas.

Yra keli būdai atsisiųsti programą:

  • per Xcode (organizatorius),
  • per altool,
  • per Application Loader senesnėms Xcode versijoms (dabar Transporter).

Automatiniam atsisiuntimui naudojamas altool, kuris taip pat turi du autorizacijos būdus:

  • Konkrečios programos slaptažodis,
  • API raktas.

Pageidautina atsisiųsti programą naudojant API raktą.

Norėdami gauti API raktą, eikite į nuoroda ir sugeneruoti raktą. Be paties rakto *.p8 formatu, mums reikės dviejų parametrų: IssuerID ir KeyID.

iOS programų kūrimo ir pristatymo ypatybės

Tada importuokite atsisiųstą raktą į kūrimo serverį:

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

Prieš įkeldami programą į „TestFlight“, turite patvirtinti programą, tai darome komanda:

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

kur apiKey и apiIssuer turi laukų reikšmes iš API rakto generavimo puslapio.

Toliau, sėkmingai patvirtinus, įkeliame programą su komanda --upload-app su tais pačiais parametrais.

Programą „Apple“ išbandys per vieną ar dvi dienas, o vėliau ji taps prieinama išoriniams bandytojams: el. paštu jiems bus išsiųstos diegimo nuorodos.

Kitas būdas atsisiųsti programą per altool yra naudoti programos specifinį slaptažodį.

Norėdami gauti konkrečios programos slaptažodį, turite eiti į nuoroda ir sugeneruokite jį skiltyje Sauga.

iOS programų kūrimo ir pristatymo ypatybės

Tada turėtumėte sukurti serverio kūrimo įrašą „Keychain“ naudodami šį slaptažodį. Nuo 11 Xcode versijos tai galima padaryti naudojant komandą:

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

Kur:

$DeveloperName — iOS kūrėjo paskyros, naudotos prisijungiant prie Apple paslaugų, pavadinimas.

$AppPswd - sugeneruotas konkrečios programos slaptažodis.

Tada gauname asc-provider parametro reikšmę ir patikriname slaptažodžio importavimo sėkmę naudodami komandą:

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

Gauname išvestį:

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

Kaip matote, reikalinga trumpojo pavadinimo reikšmė (asc-provider) sutampa su $TeamID parametru, kurį naudojome kurdami programą.

Norėdami patvirtinti ir įkelti programą į „TestFlight“, naudokite komandą:

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

Kaip parametro reikšmė -p galite paimti vertę $AppPswd nešifruota (aiškia) forma.

Tačiau, kaip jau minėta, našumo požiūriu, altool autorizacijai geriau pasirinkti API raktą, nes skirtingos Xcode versijos turi tam tikrų problemų („nemato“ Keychain, autorizacijos klaidos įkėlimo metu ir kt.).

Tai viskas, iš tikrųjų. Linkiu visiems, kurie dalyvauja sėkmingai kuriant ir be problemų išleidžiant „App Store“.

Šaltinis: www.habr.com

Добавить комментарий