Značajke izgradnje i isporuke iOS aplikacija

U ovom članku dijelimo iskustvo sastavljanja i isporuke iOS aplikacija korisnicima koje je studio Plarium Krasnodar skupio u procesu otklanjanja pogrešaka CI/CD-a.

Značajke izgradnje i isporuke iOS aplikacija

Trening

Svatko tko je na ovaj ili onaj način uključen u razvoj aplikacija za Apple uređaje već je cijenio kontroverznu pogodnost infrastrukture. Poteškoće se nalaze posvuda: od izbornika profila razvojnog programera do alata za uklanjanje pogrešaka i izradu.

Na internetu postoji mnogo članaka o “osnovama”, pa ćemo pokušati istaknuti ono glavno. Evo što vam je potrebno za uspješnu izradu vaše aplikacije:

  • račun razvojnog programera;
  • uređaj temeljen na macOS-u koji djeluje kao poslužitelj za izgradnju;
  • generiran certifikat programera, koji će se dalje koristiti za potpisivanje zahtjeva;
  • kreirana aplikacija s jedinstvenim ID (treba napomenuti važnost identifikatora paketa, jer upotreba zamjenskog ID-a onemogućuje korištenje mnogih funkcija aplikacije, na primjer: pridružene domene, push obavijesti, Apple prijava i druge);
  • profil potpisi aplikacije.

Certifikat razvojnog programera mora se generirati putem Keychaina na bilo kojem macOS uređaju. Vrlo je važna vrsta certifikata. Ovisno o okruženju aplikacije (Dev, QA, Staging, Production) razlikovat će se (Razvoj ili Distribucija), kao i vrsta profila potpisa aplikacije.

Glavne vrste profila:

  • Razvoj - namijenjen za potpisivanje aplikacije razvojnog tima, koristi se Razvojni certifikat (naziv tipa iPhone Developer: XXXXX);
  • Ad Hoc - namijenjen potpisivanju testne aplikacije i internoj provjeri od strane QA odjela, koristi se Distribution certifikat programera (tip naziva iPhone Distribution: XXXXX);
  • App Store - izdanje verzije za vanjsko testiranje putem TestFlighta i učitavanje u App Store, koristi se Distribucijski certifikat razvojnog programera.

Kod generiranja razvojnih i ad hoc profila također je naznačeno popis uređaja, na koji možete instalirati međugradnju, koja vam omogućuje dodatno ograničavanje pristupa korisnicima. Ne postoji popis uređaja u App Store profilu, budući da kontrolu pristupa tijekom zatvorenog beta testiranja obavlja TestFlight, o čemu ćemo kasnije.

Radi jasnoće, možete predstaviti profil programera u obliku tablice u nastavku. To olakšava razumijevanje parametara koji su nam potrebni za montažu i odakle ih dobiti.

Značajke izgradnje i isporuke iOS aplikacija

zbor

Kako bismo olakšali odvajanje sklopova po projektu i okruženju, koristimo nazive profila kao što su ${ProjectName}_${Instance}, odnosno naziv projekta + instanca (ovisi o okruženju aplikacije: Dev, QA, GD, Staging, Live i tako dalje).

Kada se uveze na poslužitelj za izradu, profil mijenja svoje ime u jedinstveni ID i premješta se u mapu /Users/$Username/Library/MobileDevice/Provisioning Profiles (gdje $Username odgovara nazivu korisničkog računa poslužitelja za izgradnju).

Postoje dva načina za izradu *.ipa datoteke - naslijeđeni (PackageApplication) i moderan (putem XcAchive stvaranja i izvoza). Prva se metoda smatra zastarjelom jer je od verzije 8.3 modul za pakiranje datoteka aplikacije uklonjen iz Xcode distribucije. Da biste ga koristili, trebate kopirati modul iz starog Xcode-a (verzija 8.2 i starije) u mapu:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

Zatim pokrenite naredbu:

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

Zatim trebate prikupiti *.app datoteku 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

Gdje:

-workspace — put do datoteke projekta.

-scheme — korištena shema navedena u projektu.

-derivedDataPath — staza za preuzimanje sastavljene aplikacije (*.app).

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

Značajke izgradnje i isporuke iOS aplikacija

PROVISIONING_PROFILE — ID profila za potpisivanje aplikacije koji se dobiva 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), tada umjesto PROVISIONING_PROFILE označiti:

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

Zatim, rezultirajuća *.app datoteka treba biti zapakirana 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 se metoda s Appleovog gledišta smatra zastarjelom. Relevantno je dobiti *.ipa izvozom iz arhive aplikacije.

Prvo morate prikupiti 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 leže u načinu montaže i opcijama SYNCHRONOUS_SYMBOL_PROCESSING, koji onemogućuje istovar simbola tijekom 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

Gdje:

$Method — način isporuke, odgovara tipu profila potpisa aplikacije, odnosno za Development vrijednost će biti development, 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 — ime razvojnog programera i postavke ID profila potpisa koje su prethodno korištene i moraju odgovarati vrijednostima u postavkama izvoza.

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

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

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

Dostava

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

Postoje mnoge usluge za distribuciju Development i Ad Hoc buildova, kao što su HockeyApp, AppBlade i drugi, ali u ovom ćemo članku govoriti o samostalnom poslužitelju za distribuciju aplikacija.

Instalacija aplikacije za iOS odvija se u 2 faze:

  1. Primanje manifesta instalacije aplikacije putem usluge Stavke.
  2. Instalacija *.ipa datoteke prema podacima navedenim u manifestu putem HTTPS-a.

Dakle, prvo moramo generirati instalacijski manifest (tip datoteke *.plist) s 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 izradu aplikacije.

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

defaults read $ProjectDir/Info CFBundleVersion

Parametar $ipaUrl sadrži izravnu vezu za preuzimanje *.ipa datoteke. Od sedme verzije iOS-a aplikacija mora biti instalirana putem HTTPS-a. U osmoj verziji, format manifesta malo se promijenio: blokovi s postavkama za ikone aplikacija poput

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

Dakle, za instalaciju aplikacije dovoljna je jednostavna HTML stranica s poveznicom poput ove:

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

Za potrebe odjela razvoja i testiranja, Plarium je izradio vlastitu aplikaciju za instalaciju izgradnje koja nam daje:

  • samostalnost i neovisnost,
  • centralizacija kontrole pristupa i sigurne instalacije aplikacija putem „privremenih“ dinamički kreiranih poveznica,
  • proširivu funkcionalnost (odnosno, razvojni tim, ako je potrebno, može integrirati funkcije koje nedostaju u postojeću aplikaciju).

Testiranje

Sada ćemo govoriti o testiranju prije izdavanja aplikacije pomoću TestFlight.

Potrebni uvjeti za preuzimanje su vrsta profila potpisa App Storea i prisutnost generiranih API ključeva.

Postoji nekoliko načina za preuzimanje aplikacije:

  • preko Xcode (organizator),
  • preko altoola,
  • putem Application Loader-a za starije verzije Xcode-a (sada Transporter).

Za automatsko preuzimanje koristi se altool koji također ima dvije metode autorizacije:

  • Zaporka za aplikaciju,
  • API ključ.

Poželjno je preuzeti aplikaciju pomoću API ključa.

Da biste dobili API ključ, idite na link i generirajte ključ. Osim samog ključa u *.p8 formatu, trebat će nam dva parametra: IssuerID i KeyID.

Značajke izgradnje i isporuke iOS aplikacija

Zatim uvezite preuzeti ključ na poslužitelj za izgradnju:

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

Prije postavljanja aplikacije na TestFlight, morate potvrditi aplikaciju, to radimo naredbom:

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

gdje apiKey и apiIssuer imaju vrijednosti polja sa stranice za generiranje API ključa.

Zatim, nakon uspješne provjere valjanosti, učitavamo aplikaciju s naredbom --upload-app s istim parametrima.

Apple će testirati aplikaciju u roku od jednog ili dva dana, a zatim će postati dostupna vanjskim testerima: poslat će im e-poštom veze za instalaciju.

Drugi način preuzimanja aplikacije putem altoola je korištenje lozinke za određenu aplikaciju.

Da biste dobili zaporku za određenu aplikaciju, morate otići na link i generirajte ga u odjeljku Sigurnost.

Značajke izgradnje i isporuke iOS aplikacija

Zatim biste trebali stvoriti zapis poslužitelja za izgradnju u Keychainu s 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

Gdje:

$DeveloperName — naziv računa razvojnog programera za iOS koji se koristi za prijavu na Appleove usluge.

$AppPswd — generirana lozinka za aplikaciju.

Zatim dobivamo vrijednost parametra asc-provider i provjeravamo uspješnost uvoza lozinke naredbom:

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

Dobivamo izlaz:

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

Kao što vidite, potrebna vrijednost kratkog naziva (asc-provider) podudara se s parametrom $TeamID koji smo koristili prilikom izrade aplikacije.

Za provjeru valjanosti i učitavanje aplikacije 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šifriranom (eksplicitnom) obliku.

Međutim, kao što je već spomenuto, sa stajališta performansi, bolje je odabrati API ključ za autorizaciju altoola, jer različite verzije Xcode-a imaju određene probleme ("ne vidi" Keychain, pogreške autorizacije tijekom učitavanja itd.).

To je zapravo sve. Svima uključenima želim uspješne izrade i izdanja bez problema u App Storeu.

Izvor: www.habr.com

Dodajte komentar