Karakteristike montaže i isporuke iOS aplikacija

U ovom članku dijelimo iskustvo izgradnje i isporuke iOS aplikacija korisnicima, koje je Plarium Krasnodar stekao u procesu otklanjanja grešaka u CI/CD-u.

Karakteristike montaže i isporuke iOS aplikacija

Trening

Svaka osoba, na ovaj ili onaj način povezana s razvojem aplikacija za Apple uređaje, već je uspjela cijeniti kontroverznu pogodnost infrastrukture. Složenosti su svuda, od menija profila programera do alata za otklanjanje grešaka i pravljenje.

Na internetu ima dosta članaka o „osnovama“, pa ćemo pokušati da istaknemo ono glavno. Evo šta vam je potrebno za uspješnu izradu aplikacije:

  • račun programera;
  • uređaj zasnovan na macOS-u koji djeluje kao server za izgradnju;
  • generisano sertifikat programera, koji će se dalje koristiti za potpisivanje aplikacije;
  • kreirana aplikacija sa unikatnom ID (Treba napomenuti važnost Bundle Identifier-a, jer upotreba džoker ID-a onemogućava korištenje mnogih funkcija aplikacije, na primjer: Pridružene domene, Push obavijesti, Apple Sign In i druge);
  • profil potpis aplikacije.

Certifikat programera mora biti generiran putem Keychain-a na bilo kojem macOS uređaju. Vrsta sertifikata je veoma važna. U zavisnosti od okruženja aplikacije (Dev, QA, Staging, Production), razlikuje se (razvoj ili distribucija), kao i tip profila za potpisivanje aplikacije.

Glavne vrste profila:

  • Razvoj - dizajniran za potpisivanje aplikacije razvojnog tima, koristi se razvojni certifikat (naziv tipa iPhone Developer: XXXXX);
  • Ad Hoc - namijenjen za potpisivanje testne aplikacije i internu verifikaciju od strane QA odjela, korištenjem sertifikata o distribuciji programera (naziv tipa iPhone Distribution: XXXXX);
  • App Store je verzija izdanja za eksterno testiranje putem TestFlight-a i otpremanje u App Store, koristeći sertifikat o distribuciji programera.

Prilikom generiranja razvojnih i ad hoc profila, to je također naznačeno popis uređaja, na koji možete instalirati build, što vam omogućava dodatno ograničavanje pristupa korisnicima. Ne postoji lista uređaja u App Store profilu, jer je TestFlight, o čemu će biti reči kasnije, odgovoran za kontrolu pristupa tokom zatvorenog beta testiranja.

Radi jasnoće, možete predstaviti profil programera u obliku tabele ispod. To olakšava razumijevanje koji su nam parametri za sklop potrebni i odakle ih dobiti.

Karakteristike montaže i isporuke iOS aplikacija

Montaža

Da bismo olakšali odvajanje sklopova po projektu i okruženju, koristimo nazive profila forme ${ProjectName}_${Instance}, odnosno naziv projekta + instanca (u zavisnosti od okruženja aplikacije: Dev, QA, GD, Staging, Live, itd.).

Kada se uveze na server za izgradnju, profil mijenja svoje ime u jedinstveni ID i premješta se u mapu /Users/$Username/Library/MobileDevice/Provisioning Profiles (Gdje $Username odgovara imenu korisničkog naloga servera za izgradnju).

Postoje dva načina za sastavljanje *.ipa datoteke - zastarjela (PackageApplication) i moderna (kroz kreiranje i izvoz XcAchivea). Prva metoda se smatra zastarjelom, budući da je modul za pakovanje datoteka aplikacije uklonjen iz Xcode distribucije od verzije 8.3. Da biste ga koristili, morate kopirati modul iz starog Xcodea (verzija 8.2 i ranije) u mapu:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

A zatim pokrenite naredbu:

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

Zatim morate napraviti datoteku *.app aplikacije:

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

Gde:

-workspace - put do projektne datoteke.

-scheme - korištena šema navedena u projektu.

-derivedDataPath - putanja za istovar sastavljene aplikacije (*.app).

CODE_SIGN_IDENTITY — naziv računa programera, koji se može provjeriti u Keychain-u (iPhone Developer: XXXX XXXXXXX, bez TeamID-a u zagradama).

Karakteristike montaže i isporuke iOS aplikacija

PROVISIONING_PROFILE — ID profila za potpisivanje aplikacije, koji se može dobiti naredbom:

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

Ako aplikacija koristi dodatni profil (na primjer, za Push obavijesti), onda umjesto PROVISIONING_PROFILE ukazati:

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

Zatim, rezultujuću *.app datoteku treba upakovati u *.ipa. Da biste to učinili, možete koristiti naredbu poput:

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

Međutim, ova metoda se smatra zastarjelom sa stanovišta Applea. Relevantno je dobijanje *.ipa izvozom iz arhive aplikacije.

Prvo morate napraviti arhivu naredbom:

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

Razlike su u načinu montaže i opcijama SYNCHRONOUS_SYMBOL_PROCESSING, koji onemogućuje istovar simbola u vrijeme izgradnje.

Zatim moramo generirati datoteku s postavkama izvoza:

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

Gde:

$Method - način isporuke, odgovara tipu profila aplikacije potpisa, odnosno za razvoj će vrijednost biti razvoj, za Ad Hoc - ad-hoc, a za App Store - app-store.

$BundleID - ID aplikacije, koji je naveden u postavkama aplikacije. Možete provjeriti naredbom:

defaults read $ProjectDir/Info CFBundleIdentifier

$DevAccName и $ProfileId - postavke imena programera i profila potpisa koje su prethodno korištene i moraju odgovarati vrijednostima u postavkama izvoza.

$TeamID - desetocifreni ID u zagradama iza imena programera, primjer: iPhone Developer: ...... (XXXXXXXXXX); može se provjeriti u Keychain-u.

Zatim, koristeći naredbu za izvoz, dobijamo potrebnu * .ipa datoteku:

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

Informacije o isporuci

Sada sastavljenu datoteku treba isporučiti krajnjem korisniku, odnosno instalirati na uređaj.

Postoji mnogo servisa za distribuciju Development i Ad Hoc build-ova, kao što su HockeyApp, AppBlade i drugi, ali u ovom članku ćemo se fokusirati na samostalni server za distribuciju aplikacija.

Instalacija iOS aplikacije odvija se u 2 faze:

  1. Dobijanje manifesta instalacije aplikacije putem usluge Items.
  2. Instaliranje *.ipa datoteke prema informacijama navedenim u manifestu putem HTTPS-a.

Dakle, prvo moramo generirati instalacijski manifest (tip datoteke *.plist) sa naredbom:

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

Kao što vidite, manifest sadrži gotovo sve parametre uključene u izgradnju aplikacije.

Verzija aplikacije ($AppVersion) može se provjeriti naredbom:

defaults read $ProjectDir/Info CFBundleVersion

Parametar $ipaUrl sadrži direktnu vezu za preuzimanje *.ipa datoteke. Od sedme verzije iOS-a, aplikacija mora biti instalirana putem HTTPS-a. U osmoj verziji format manifesta je malo promijenjen: uklonjeni su blokovi s postavkama za ikone aplikacija u pogledu.

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

Dakle, za instaliranje aplikacije dovoljna je jednostavna html stranica sa linkom poput ove:

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

Za potrebe odjela za razvoj i testiranje, Plarium je kreirao vlastitu build instalacijsku aplikaciju koja nam daje:

  • samostalnost i nezavisnost,
  • centralizacija kontrole pristupa i sigurna instalacija aplikacija putem "privremenih", dinamički kreiranih linkova,
  • proširiva funkcionalnost (odnosno, razvojni tim, ako je potrebno, može integrirati nedostajuće funkcije u postojeću aplikaciju).

Testiranje

Sada ćemo govoriti o testiranju aplikacije prije izdanja TestFlight.

Preduvjeti za preuzimanje su vrsta profila za potpisivanje App Store-a i prisustvo generiranih API ključeva.

Postoji nekoliko načina za preuzimanje aplikacije:

  • putem Xcodea (Organizator),
  • preko altola,
  • preko Application Loader-a za starije verzije Xcode-a (sada Transporter).

Za automatsko preuzimanje koristi se altool, koji također ima dva načina autorizacije:

  • Posebna lozinka za aplikaciju,
  • API ključ.

Poželjno je preuzeti aplikaciju koristeći API ključ.

Da biste dobili API ključ, idite na link i generirati ključ. Pored samog ključa u *.p8 formatu, potrebna su nam dva parametra: IssuerID i KeyID.

Karakteristike montaže i isporuke iOS aplikacija

Zatim uvezite preuzeti ključ na server za izgradnju:

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

Prije učitavanja aplikacije na TestFlight, potrebno je potvrditi aplikaciju, to radimo naredbom:

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

Gde apiKey и apiIssuer imaju vrijednosti polja sa stranice za generiranje API ključeva.

Nadalje, nakon uspješne validacije, učitavamo aplikaciju sa naredbom --upload-app sa istim parametrima.

Aplikaciju će Apple testirati u roku od jednog ili dva dana, a nakon toga će postati dostupna vanjskim testerima: poštom će im biti poslani linkovi za instalaciju.

Drugi način za preuzimanje aplikacije putem altool-a je korištenje lozinke specifične za aplikaciju.

Da biste dobili posebnu lozinku za aplikaciju, trebate otići na link i generirajte ga u odjeljku Sigurnost.

Karakteristike montaže i isporuke iOS aplikacija

Zatim kreirajte unos servera za izgradnju u Keychain-u sa ovom lozinkom. Od verzije 11 Xcode-a, to se može učiniti naredbom:

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

Gde:

$DeveloperName — Ime naloga iOS programera koji se koristi za prijavu na Apple usluge.

$AppPswd - generirana posebna lozinka za aplikaciju.

Zatim dobijamo vrijednost parametra asc-provider i provjeravamo uspješnost uvoza lozinke pomoću naredbe:

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

Dobijamo izlaz:

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

Kao što možete vidjeti, željena vrijednost kratkog imena (asc-provider) odgovara parametru $TeamID koji smo koristili prilikom izrade aplikacije.

Da potvrdite i učitate aplikaciju u TestFlight, koristite naredbu:

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

Kao vrijednost parametra -p možete uzeti vrijednost $AppPswd u nešifrovanom (eksplicitnom) obliku.

Međutim, kao što je već spomenuto, sa stanovišta performansi, bolje je odabrati API ključ za autorizaciju alata, jer različite verzije Xcode-a imaju određene probleme („ne vidi“ Keychain, greške pri autorizaciji pri učitavanju itd. ).

To je, u stvari, sve. Želim svima koji su uključeni u uspješne verzije i izdanja bez problema u App Storeu.

izvor: www.habr.com

Dodajte komentar