Az iOS-alkalmazások létrehozásának és szállításának jellemzői

Ebben a cikkben megosztjuk az iOS-alkalmazások összeállításával és a felhasználókkal való eljuttatásával kapcsolatos tapasztalatokat, amelyeket a Plarium Krasnodar stúdió a CI/CD hibakeresése során halmozott fel.

Az iOS-alkalmazások létrehozásának és szállításának jellemzői

Edzés

Minden olyan személy, aki valamilyen módon részt vesz az Apple eszközök alkalmazásainak fejlesztésében, már értékelte az infrastruktúra vitatott kényelmét. A nehézségek mindenhol megtalálhatók: a fejlesztői profil menütől a hibakereső és -építő eszközökig.

Az „alapokról” rengeteg cikk található az interneten, ezért igyekszünk kiemelni a lényeget. Íme, mire van szüksége az alkalmazás sikeres elkészítéséhez:

  • fejlesztői fiók;
  • egy macOS-alapú eszköz, amely build szerverként működik;
  • generált fejlesztői tanúsítvány, amely a továbbiakban a kérelem aláírására szolgál;
  • egyedi alkalmazással készült ID (Meg kell jegyezni a Bundle Identifier fontosságát, mert a helyettesítő karakter azonosító használata lehetetlenné teszi az alkalmazás számos funkciójának használatát, például: Társított tartományok, Push Notifications, Apple Sign In és mások);
  • profil alkalmazás aláírások.

Fejlesztői tanúsítványt kell generálni a Keychain segítségével bármely macOS-eszközön. A tanúsítvány típusa nagyon fontos. Az alkalmazáskörnyezettől függően (Fejlesztő, minőségbiztosítás, állomásozás, gyártás) eltérő lehet (fejlesztés vagy terjesztés), valamint az alkalmazás aláírási profiljának típusa.

A profilok fő típusai:

  • Fejlesztés - a fejlesztőcsapat jelentkezésének aláírására szolgál, Fejlesztési tanúsítványt használnak (típusnév iPhone Developer: XXXXX);
  • Ad Hoc - tesztalkalmazás aláírására és a minőségbiztosítási részleg belső ellenőrzésére szolgál, a fejlesztő terjesztési tanúsítványát használják (típusnév iPhone Distribution: XXXXX);
  • App Store – kiadás a TestFlight-on keresztüli külső teszteléshez és az App Store-ba való feltöltéshez, a fejlesztő terjesztési tanúsítványa használatos.

Fejlesztési és Ad Hoc profilok generálásakor ez is feltüntetésre kerül eszközlista, amelyre telepíthet egy buildet, amely lehetővé teszi a felhasználók hozzáférésének további korlátozását. Az App Store profilban nincs eszközök listája, mivel a zárt béta tesztelés során a hozzáférés szabályozását a TestFlight kezeli, amiről később lesz szó.

Az egyértelműség kedvéért a fejlesztő profilját az alábbi táblázat formájában is bemutathatja. Így könnyebben érthető, hogy milyen paraméterekre van szükségünk az összeszereléshez, és honnan szerezzük be azokat.

Az iOS-alkalmazások létrehozásának és szállításának jellemzői

gyülekezés

Az összeállítások projekt és környezet szerinti szétválasztásának megkönnyítése érdekében profilneveket használunk, mint pl ${ProjectName}_${Instance}, azaz a projekt neve + példány (az alkalmazási környezettől függően: Dev, QA, GD, Staging, Live és így tovább).

Amikor importálják az összeállítási kiszolgálóra, a profil nevét egyedi azonosítóra változtatja, és átkerül a mappába /Users/$Username/Library/MobileDevice/Provisioning Profiles (ahol $Username megfelel a build szerver felhasználói fiók nevének).

Kétféleképpen készíthet *.ipa fájlt – örökölt (PackageApplication) és modern (XcAchive létrehozásával és exportálásával). Az első módszer elavultnak tekinthető, mivel a 8.3-as verzió óta az alkalmazásfájl-csomagoló modult eltávolították az Xcode-terjesztésből. Használatához át kell másolnia a modult a régi Xcode-ból (8.2 és korábbi verzió) a mappába:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

Ezután futtassa a parancsot:

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

Ezután össze kell gyűjtenie az alkalmazás *.app fájlját:

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

Hol:

-workspace — a projektfájl elérési útja.

-scheme — a projektben meghatározott, alkalmazott séma.

-derivedDataPath — elérési út az összeállított alkalmazás letöltéséhez (*.app).

CODE_SIGN_IDENTITY — a fejlesztői fiók neve, amely a Kulcstartóban ellenőrizhető (iPhone Developer: XXXX XXXXXXX, TeamID nélkül zárójelben).

Az iOS-alkalmazások létrehozásának és szállításának jellemzői

PROVISIONING_PROFILE — Profilazonosító a kérelem aláírásához, amely a következő paranccsal szerezhető be:

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

Ha az alkalmazás további profilt használ (például push értesítésekhez), akkor ahelyett PROVISIONING_PROFILE jelezze:

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

Ezután az eredményül kapott *.app fájlt az *.ipa fájlba kell csomagolni. Ehhez használhat egy parancsot, például:

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

Ez a módszer azonban az Apple szemszögéből elavultnak számít. Fontos az *.ipa beszerzése az alkalmazásarchívumból történő exportálással.

Először össze kell gyűjtenie az archívumot a következő paranccsal:

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

A különbségek az összeszerelési módban és az opciókban rejlenek SYNCHRONOUS_SYMBOL_PROCESSING, amely letiltja a szimbólumok eltávolítását az építési időben.

Ezután létre kell hoznunk egy fájlt az exportálási beállításokkal:

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

Hol:

$Method — szállítási mód, az alkalmazás aláírási profil típusának felel meg, vagyis a Fejlesztésnél fejlesztés, az Ad Hoc esetében az ad-hoc, az App Store esetében pedig az alkalmazásbolt lesz az érték.

$BundleID — Alkalmazásazonosító, amely az alkalmazás beállításaiban van megadva. A következő paranccsal ellenőrizheti:

defaults read $ProjectDir/Info CFBundleIdentifier

$DevAccName и $ProfileId — a korábban használt fejlesztői név és aláírási profil azonosító beállításai, amelyeknek meg kell egyeznie az exportálási beállításokban szereplő értékekkel.

$TeamID — tízjegyű azonosító zárójelben a fejlesztő neve után, példa: iPhone Fejlesztő: …… (XXXXXXXXXX); Kulcstartóban ellenőrizhető.

Ezután az export paranccsal megkapjuk a szükséges *.ipa fájlt:

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

Kézbesítés

Most az összegyűjtött fájlt el kell juttatni a végfelhasználóhoz, azaz telepíteni kell az eszközre.

Számos szolgáltatás létezik a fejlesztési és ad hoc buildek terjesztésére, mint például a HockeyApp, AppBlade és mások, de ebben a cikkben az alkalmazások terjesztésére szolgáló önálló szerverről lesz szó.

Az iOS alkalmazás telepítése 2 lépésben történik:

  1. Az alkalmazás telepítési jegyzékének fogadása az Item Servicen keresztül.
  2. Az *.ipa fájl telepítése a jegyzékben megadott információk szerint HTTPS-en keresztül.

Ezért először létre kell hoznunk egy telepítési jegyzéket (*.plist fájltípus) a következő paranccsal:

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

Amint láthatja, a jegyzék szinte minden paramétert tartalmaz, amelyek az alkalmazás felépítéséhez szükségesek.

Alkalmazás verzió ($AppVersion) a következő paranccsal ellenőrizhető:

defaults read $ProjectDir/Info CFBundleVersion

Paraméter $ipaUrl tartalmaz egy közvetlen hivatkozást az *.ipa fájl letöltéséhez. Az iOS hetedik verziójától kezdve az alkalmazást HTTPS-en keresztül kell telepíteni. A nyolcadik verzióban a jegyzék formátuma kissé megváltozott: blokkok az alkalmazásikonok beállításaival, mint például

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

Így az alkalmazás telepítéséhez elegendő egy egyszerű HTML oldal egy ilyen hivatkozással:

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

A fejlesztési és tesztelési részlegek igényeire a Plarium elkészítette saját build telepítő alkalmazását, amely a következőket nyújtja:

  • autonómia és függetlenség,
  • a hozzáférés-vezérlés központosítása és az alkalmazások biztonságos telepítése „ideiglenes” dinamikusan létrehozott hivatkozásokon keresztül,
  • bővíthető funkcionalitás (vagyis a fejlesztőcsapat szükség esetén integrálhatja a hiányzó funkciókat egy meglévő alkalmazásba).

tesztelés

Most az alkalmazás kiadás előtti teszteléséről fogunk beszélni TestFlight.

A letöltéshez szükséges feltételek az App Store aláírási profil típusa és a generált API-kulcsok megléte.

Az alkalmazás letöltésének többféle módja van:

  • az Xcode-on keresztül (Szervező),
  • alteszközön keresztül,
  • az Application Loader segítségével az Xcode (most Transporter) régebbi verzióihoz.

Az automatikus letöltéshez az altool használatos, amelynek két engedélyezési módja is van:

  • Alkalmazás-specifikus jelszó,
  • API kulcs.

Célszerű az alkalmazást az API-kulcs segítségével letölteni.

Az API-kulcs beszerzéséhez látogasson el ide link és generál egy kulcsot. A *.p8 formátumú kulcson kívül két paraméterre lesz szükségünk: Kibocsátóazonosítóra és Kulcsazonosítóra.

Az iOS-alkalmazások létrehozásának és szállításának jellemzői

Ezután importálja a letöltött kulcsot a build szerverre:

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

Mielőtt feltöltené az alkalmazást a TestFlight-ba, érvényesíteni kell az alkalmazást, ezt a következő paranccsal tesszük:

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

ahol apiKey и apiIssuer mezőértékekkel rendelkezik az API-kulcsgeneráló oldalon.

Ezután sikeres érvényesítés után betöltjük az alkalmazást a paranccsal --upload-app ugyanazokkal a paraméterekkel.

Az alkalmazást az Apple egy-két napon belül teszteli, majd elérhetővé válik a külső tesztelők számára: e-mailben küldik el nekik a telepítéshez szükséges linkeket.

Egy másik módja annak, hogy egy alkalmazást az altoolon keresztül töltsön le, az alkalmazásspecifikus jelszó használata.

Az alkalmazásspecifikus jelszó beszerzéséhez a következő helyre kell lépnie link és generálja azt a Biztonság részben.

Az iOS-alkalmazások létrehozásának és szállításának jellemzői

Ezután hozzon létre egy build szerverrekordot a Keychainben ezzel a jelszóval. Az Xcode 11-es verziójától ezt a következő paranccsal lehet megtenni:

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

Hol:

$DeveloperName — az Apple szolgáltatásokba való bejelentkezéshez használt iOS fejlesztői fiók neve.

$AppPswd — generált alkalmazás-specifikus jelszó.

Ezután megkapjuk az asc-provider paraméter értékét, és ellenőrizzük a jelszóimportálás sikerességét a következő paranccsal:

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

A kimenetet kapjuk:

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

Amint látható, a szükséges rövid név érték (asc-provider) egybeesik az alkalmazás felépítésénél használt $TeamID paraméterrel.

Az alkalmazás ellenőrzéséhez és betöltéséhez a TestFlight-ba használja a következő parancsot:

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

Paraméter értékként -p veheted az értéket $AppPswd titkosítatlan (explicit) formában.

Azonban, mint már említettük, a teljesítmény szempontjából jobb, ha az API kulcsot választja az altool hitelesítéshez, mivel az Xcode különböző verzióiban vannak bizonyos problémák ("nem látja" a kulcstartót, engedélyezési hibák feltöltés közben stb.).

Valójában ennyi. Mindenkinek, aki részt vesz, kívánok sikeres összeállítást és problémamentes kiadásokat az App Store-ban.

Forrás: will.com

Hozzászólás