Funkce vytváření a poskytování aplikací pro iOS

V tomto článku sdílíme zkušenosti se sestavováním a dodáváním iOS aplikací uživatelům, které studio Plarium Krasnodar nashromáždilo v procesu ladění CI/CD.

Funkce vytváření a poskytování aplikací pro iOS

Trénink

Každý člověk, který se tak či onak zabývá vývojem aplikací pro zařízení Apple, již ocenil kontroverzní pohodlí infrastruktury. Potíže se vyskytují všude: od nabídky profilu vývojáře po nástroje pro ladění a sestavení.

Na internetu je spousta článků o „základech“, takže se pokusíme zdůraznit to hlavní. Zde je to, co potřebujete k úspěšnému vytvoření aplikace:

  • vývojářský účet;
  • zařízení založené na macOS fungující jako server sestavení;
  • vytvořené certifikát vývojáře, který bude dále použit k podpisu přihlášky;
  • vytvořená aplikace s unikátní ID (je třeba upozornit na důležitost Bundle Identifier, protože použití zástupného ID znemožňuje použití mnoha funkcí aplikace, např.: Associated Domains, Push Notifications, Apple Sign In a další);
  • profil podpisy aplikací.

Certifikát vývojáře musí být vygenerován prostřednictvím Keychain na jakémkoli zařízení macOS. Typ certifikátu je velmi důležitý. V závislosti na aplikačním prostředí (Vývoj, QA, Staging, Výroba) se bude lišit (Vývoj nebo Distribuce), stejně jako typ profilu podpisu aplikace.

Hlavní typy profilů:

  • Development - určeno k podepisování aplikace vývojového týmu, používá se Vývojový certifikát (název typu iPhone Developer: XXXXX);
  • Ad Hoc - určeno k podpisu testovací aplikace a internímu ověření oddělením QA, používá se Distribuční certifikát vývojáře (název typu iPhone Distribuce: XXXXX);
  • App Store - release build pro externí testování přes TestFlight a nahrání do App Store, používá se Distribuční certifikát vývojáře.

Při generování profilů Development a Ad Hoc je to také uvedeno seznam zařízení, na který si můžete nainstalovat sestavení, které umožňuje dále omezit přístup pro uživatele. V profilu App Store není žádný seznam zařízení, protože řízení přístupu během uzavřeného beta testování má na starosti TestFlight, o kterém bude řeč později.

Pro přehlednost můžete profil vývojáře prezentovat ve formě tabulky níže. Snáze tak pochopíme, jaké parametry k montáži potřebujeme a odkud je získat.

Funkce vytváření a poskytování aplikací pro iOS

shromáždění

Abychom usnadnili oddělení sestav podle projektu a prostředí, používáme názvy profilů jako ${ProjectName}_${Instance}, tedy název projektu + instance (závisí na prostředí aplikace: Dev, QA, GD, Staging, Live a tak dále).

Při importu na server sestavení změní profil svůj název na jedinečné ID a přesune se do složky /Users/$Username/Library/MobileDevice/Provisioning Profiles (Kde $Username odpovídá názvu uživatelského účtu sestavení serveru).

Existují dva způsoby, jak vytvořit soubor *.ipa – starší (PackageApplication) a moderní (prostřednictvím vytvoření a exportu XcAchive). První metoda je považována za zastaralou, protože od verze 8.3 byl modul balení souborů aplikace odstraněn z distribuce Xcode. Chcete-li jej použít, musíte zkopírovat modul ze starého Xcode (verze 8.2 a starší) do složky:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

A pak spusťte příkaz:

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

Dále musíte shromáždit *.app soubor aplikace:

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

Kde:

-workspace — cesta k souboru projektu.

-scheme — použité schéma specifikované v projektu.

-derivedDataPath — cesta ke stažení sestavené aplikace (*.app).

CODE_SIGN_IDENTITY — název účtu vývojáře, který lze ověřit v Keychain (iPhone Developer: XXXX XXXXXXX, bez TeamID v závorkách).

Funkce vytváření a poskytování aplikací pro iOS

PROVISIONING_PROFILE — ID profilu pro podepisování aplikace, které lze získat příkazem:

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

Pokud aplikace používá další profil (například pro Push Notifications), pak namísto PROVISIONING_PROFILE uveďte:

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

Dále by měl být výsledný soubor *.app zabalen do *.ipa. Chcete-li to provést, můžete použít příkaz jako:

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

Tato metoda je však z pohledu Applu považována za zastaralou. Je důležité získat *.ipa exportem z archivu aplikace.

Nejprve musíte shromáždit archiv pomocí příkazu:

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

Rozdíly jsou ve způsobu montáže a možnostech SYNCHRONOUS_SYMBOL_PROCESSING, který deaktivuje vykládání symbolů v době sestavení.

Dále musíme vygenerovat soubor s nastavením exportu:

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

Kde:

$Method — způsob doručení, odpovídá typu podpisového profilu aplikace, to znamená, že pro Vývoj bude hodnota vývoj, pro Ad Hoc - ad-hoc a pro App Store - app-store.

$BundleID — ID aplikace, které je zadáno v nastavení aplikace. Můžete zkontrolovat pomocí příkazu:

defaults read $ProjectDir/Info CFBundleIdentifier

$DevAccName и $ProfileId — nastavení jména vývojáře a ID profilu podpisu, která byla použita dříve a musí odpovídat hodnotám v nastavení exportu.

$TeamID — desetimístné ID v hranatých závorkách za jménem vývojáře, příklad: iPhone Developer: …… (XXXXXXXXXX); lze zkontrolovat v Keychain.

Dále pomocí příkazu export získáme potřebný soubor *.ipa:

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

Dodávka

Nyní je třeba shromážděný soubor doručit koncovému uživateli, to znamená nainstalovat na zařízení.

Existuje mnoho služeb pro distribuci Development a Ad Hoc sestavení, jako je HockeyApp, AppBlade a další, ale v tomto článku budeme hovořit o samostatném serveru pro distribuci aplikací.

Instalace aplikace pro iOS probíhá ve 2 fázích:

  1. Příjem instalačního manifestu aplikace prostřednictvím služby Items Service.
  2. Instalace souboru *.ipa podle informací uvedených v manifestu přes HTTPS.

Nejprve tedy musíme vygenerovat instalační manifest (typ souboru *.plist) příkazem:

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

Jak vidíte, manifest obsahuje téměř všechny parametry, které se podílejí na sestavování aplikace.

Verze aplikace ($AppVersion) lze zkontrolovat příkazem:

defaults read $ProjectDir/Info CFBundleVersion

Parametr $ipaUrl obsahuje přímý odkaz na stažení souboru *.ipa. Od sedmé verze iOS je nutné aplikaci instalovat přes HTTPS. V osmé verzi se mírně změnil formát manifestu: bloky s nastavením ikon aplikací jako

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

K instalaci aplikace tedy stačí jednoduchá HTML stránka s tímto odkazem:

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

Pro potřeby vývojového a testovacího oddělení vytvořilo Plarium vlastní instalační instalační aplikaci, která nám poskytuje:

  • samostatnost a nezávislost,
  • centralizace řízení přístupu a bezpečná instalace aplikací prostřednictvím „dočasných“ dynamicky vytvářených odkazů,
  • rozšiřitelná funkcionalita (to znamená, že vývojový tým může v případě potřeby integrovat chybějící funkce do existující aplikace).

Testování

Nyní budeme hovořit o předběžném testování aplikace pomocí TestFlight.

Požadované podmínky pro stažení jsou typ podpisového profilu App Store a přítomnost vygenerovaných API klíčů.

Aplikaci lze stáhnout několika způsoby:

  • přes Xcode (Organizer),
  • přes altool,
  • přes Application Loader pro starší verze Xcode (nyní Transporter).

Pro automatické stahování se používá altool, který má také dvě autorizační metody:

  • Heslo pro konkrétní aplikaci,
  • Klíč API.

Je vhodnější stáhnout aplikaci pomocí klíče API.

Chcete-li získat klíč API, přejděte na odkaz a vygenerovat klíč. Kromě samotného klíče ve formátu *.p8 budeme potřebovat dva parametry: IssuerID a KeyID.

Funkce vytváření a poskytování aplikací pro iOS

Dále importujte stažený klíč na server sestavení:

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

Před nahráním aplikace do TestFlight je třeba aplikaci ověřit, provedeme to příkazem:

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

Kde apiKey и apiIssuer mít hodnoty polí ze stránky generování klíče API.

Dále po úspěšné validaci načteme aplikaci příkazem --upload-app se stejnými parametry.

Aplikace bude společností Apple testována během jednoho nebo dvou dnů a poté bude k dispozici externím testerům: e-mailem jim budou zaslány odkazy k instalaci.

Dalším způsobem, jak stáhnout aplikaci prostřednictvím altool, je použití hesla pro konkrétní aplikaci.

Chcete-li získat heslo pro konkrétní aplikaci, musíte přejít na adresu odkaz a vygenerujte jej v sekci Zabezpečení.

Funkce vytváření a poskytování aplikací pro iOS

Dále byste měli vytvořit záznam sestavení serveru v Keychain s tímto heslem. Od verze 11 Xcode to lze provést příkazem:

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

Kde:

$DeveloperName — název účtu vývojáře iOS používaného k přihlášení ke službám Apple.

$AppPswd — vygenerované heslo pro konkrétní aplikaci.

Dále získáme hodnotu parametru asc-provider a zkontrolujeme úspěšnost importu hesla příkazem:

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

Získáme výstup:

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

Jak vidíte, požadovaná hodnota Short Name (asc-provider) se shoduje s parametrem $TeamID, který jsme použili při sestavování aplikace.

Pro ověření a načtení aplikace do TestFlight použijte příkaz:

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

Jako hodnota parametru -p můžete vzít hodnotu $AppPswd v nezašifrované (explicitní) podobě.

Jak však již bylo zmíněno, z hlediska výkonu je pro autorizaci altoolu lepší zvolit API Key, protože různé verze Xcode mají určité problémy („nevidí“ Keychain, chyby autorizace při nahrávání atd.).

To je vlastně všechno. Přeji všem zúčastněným úspěšné sestavení a bezproblémové vydání v App Store.

Zdroj: www.habr.com

Přidat komentář