Kenmerke van samestelling en aflewering van iOS-toepassings

In hierdie artikel deel ons die ervaring van die bou en lewering van iOS-toepassings aan gebruikers, wat Plarium Krasnodar opgedoen het in die proses om CI/CD te ontfout.

Kenmerke van samestelling en aflewering van iOS-toepassings

Opleiding

Elke persoon, op een of ander manier wat verband hou met die ontwikkeling van toepassings vir Apple-toestelle, het reeds daarin geslaag om die omstrede gerief van die infrastruktuur te waardeer. Kompleksiteite is oral, van die ontwikkelaarprofielkieslys tot die ontfoutings- en bounutsgoed.

Daar is baie artikels oor die "basics" op die net, so ons sal probeer om die belangrikste ding uit te lig. Hier is wat jy nodig het om die toepassing suksesvol te bou:

  • ontwikkelaar rekening;
  • 'n MacOS-gebaseerde toestel wat as 'n boubediener optree;
  • gegenereer ontwikkelaarsertifikaat, wat verder gebruik sal word om die aansoek te onderteken;
  • geskep toepassing met 'n unieke ID (Daar moet kennis geneem word van die belangrikheid van die Bundel-identifiseerder, want die gebruik van 'n jokerteken-ID maak dit onmoontlik om baie van die toepassing se funksies te gebruik, byvoorbeeld: Geassosieerde domeine, Push Notifications, Apple Sign In en ander);
  • profiel aansoek handtekening.

'n Ontwikkelaarsertifikaat moet via Sleutelhanger op enige macOS-toestel gegenereer word. Die tipe sertifikaat is baie belangrik. Afhangende van die toepassingsomgewing (Ontwikkelaar, QA, Staging, Produksie), sal dit verskil (Ontwikkeling of Verspreiding), sowel as die toepassingsondertekeningprofieltipe.

Hooftipes profiele:

  • Ontwikkeling - ontwerp om die aansoek van die ontwikkelingspan te teken, die Ontwikkelingsertifikaat word gebruik (tipe naam iPhone Ontwikkelaar: XXXXX);
  • Ad Hoc - bedoel vir die ondertekening van 'n toetsaansoek en interne verifikasie deur die QA-afdeling, met behulp van die ontwikkelaar se verspreidingsertifikaat (tipe naam iPhone-verspreiding: XXXXX);
  • App Store is 'n vrystelling gebou vir eksterne toetsing via TestFlight en oplaai na die App Store, met behulp van 'n ontwikkelaar se verspreidingsertifikaat.

Wanneer die Ontwikkelings- en Ad Hoc-profiele gegenereer word, word dit ook aangedui toestellys, waarop jy die bou kan installeer, wat jou toelaat om toegang vir gebruikers verder te beperk. Daar is geen lys toestelle in die App Store-profiel nie, aangesien TestFlight, wat later bespreek sal word, verantwoordelik is vir toegangsbeheer tydens geslote beta-toetsing.

Vir duidelikheid kan u die ontwikkelaarprofiel in die vorm van 'n tabel hieronder aanbied. Dit maak dit makliker om te verstaan ​​watter parameters vir die samestelling ons benodig en waar om dit vandaan te kry.

Kenmerke van samestelling en aflewering van iOS-toepassings

vergadering

Om dit makliker te maak om samestellings volgens projek en omgewing te skei, gebruik ons ​​die name van profiele van die vorm ${ProjectName}_${Instance}, dit wil sê die projeknaam + instansie (afhangende van die toepassingsomgewing: Dev, QA, GD, Staging, Live, ensovoorts).

Wanneer dit na die boubediener ingevoer word, verander die profiel sy naam na 'n unieke ID en skuif na die gids /Users/$Username/Library/MobileDevice/Provisioning Profiles (Waar $Username ooreenstem met die gebruikerrekeningnaam van die boubediener).

Daar is twee maniere om die *.ipa-lêer saam te stel - verouderd (PackageApplication) en modern (deur XcAchive-skepping en -uitvoer). Die eerste metode word as verouderd beskou, aangesien die programlêerverpakkingsmodule sedert weergawe 8.3 uit die Xcode-verspreiding verwyder is. Om dit te gebruik, moet jy die module van die ou Xcode (weergawe 8.2 en vroeër) na die gids kopieer:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

En voer dan die opdrag uit:

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

Vervolgens moet jy die *.app-lêer van die toepassing bou:

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

Waar:

-workspace - pad na die projeklêer.

-scheme - Gebruikte skema gespesifiseer in die projek.

-derivedDataPath - die pad om die saamgestelde toepassing af te laai (*.app).

CODE_SIGN_IDENTITY — ontwikkelaarrekeningnaam, wat in Sleutelhanger nagegaan kan word (iPhone-ontwikkelaar: XXXX XXXXXXX, geen TeamID tussen hakies nie).

Kenmerke van samestelling en aflewering van iOS-toepassings

PROVISIONING_PROFILE — Profiel-ID vir die ondertekening van die aansoek, wat verkry kan word met die opdrag:

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

As die toepassing 'n bykomende profiel gebruik (byvoorbeeld vir stootkennisgewings), dan in plaas van PROVISIONING_PROFILE dui aan:

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

Vervolgens moet die gevolglike *.app-lêer in *.ipa verpak word. Om dit te doen, kan jy 'n opdrag gebruik soos:

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

Hierdie metode word egter beskou as verouderd vanuit die oogpunt van Apple. Relevant is om *.ipa te kry deur uit die toepassingsargief uit te voer.

Eerstens moet jy die argief bou met die opdrag:

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

Die verskille is in die monteermetode en opsies SYNCHRONOUS_SYMBOL_PROCESSING, wat simboolaflaai tydens boutyd deaktiveer.

Vervolgens moet ons 'n lêer genereer met uitvoerinstellings:

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

Waar:

$Method - afleweringsmetode, stem ooreen met die toepassingshandtekeningprofieltipe, dit wil sê vir Ontwikkeling, sal die waarde ontwikkeling wees, vir Ad Hoc - ad-hoc, en vir die App Store - toepassingwinkel.

$BundleID - Toepassings-ID, wat in die toepassingsinstellings gespesifiseer word. Jy kan kyk met die opdrag:

defaults read $ProjectDir/Info CFBundleIdentifier

$DevAccName и $ProfileId - die ontwikkelaarnaam en handtekeningprofiel-ID-instellings wat voorheen gebruik is en moet ooreenstem met die waardes in die uitvoerinstellings.

$TeamID - 'n tiensyfer-ID tussen hakies na die ontwikkelaar se naam, byvoorbeeld: iPhone-ontwikkelaar: ...... (XXXXXXXXXX); kan in Sleutelhanger nagegaan word.

Volgende, met behulp van die uitvoer-opdrag, kry ons die nodige * .ipa-lêer:

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

Aflewering

Nou moet die saamgestelde lêer aan die eindgebruiker afgelewer word, dit wil sê op die toestel geïnstalleer.

Daar is baie dienste vir die verspreiding van Ontwikkeling en Ad Hoc-bou, soos HockeyApp, AppBlade en ander, maar in hierdie artikel sal ons fokus op 'n selfstandige bediener vir die verspreiding van toepassings.

Die installering van die iOS-toepassing vind in 2 fases plaas:

  1. Verkryging van die toepassingsinstallasiemanifes deur die Items Service.
  2. Installeer die *.ipa-lêer volgens die inligting gespesifiseer in die manifes via HTTPS.

Ons moet dus eers 'n installasiemanifes (lêertipe *.plist) genereer met die opdrag:

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

Soos u kan sien, bevat die manifes byna al die parameters wat betrokke is by die bou van die toepassing.

Toepassing weergawe ($AppVersion) kan nagegaan word met die opdrag:

defaults read $ProjectDir/Info CFBundleVersion

Parameter $ipaUrl bevat 'n direkte skakel om die *.ipa-lêer af te laai. Vanaf die sewende weergawe van iOS moet die toepassing via HTTPS geïnstalleer word. In die agtste weergawe het die manifesformaat effens verander: die blokke met die instellings vir die toepassingsikone van die aansig is verwyder.

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

Dus, om die toepassing te installeer, is 'n eenvoudige HTML-bladsy met 'n skakel soos hierdie genoeg:

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

Vir die behoeftes van ontwikkelings- en toetsafdelings het Plarium sy eie bou-installasietoepassing geskep, wat ons:

  • outonomie en onafhanklikheid,
  • sentralisering van toegangsbeheer en veilige installering van toepassings deur "tydelike", dinamies geskepte skakels,
  • uitbreidbare funksionaliteit (dit wil sê die ontwikkelingspan, indien nodig, kan die ontbrekende funksies in 'n bestaande toepassing integreer).

toets

Nou sal ons praat oor pre-release toetsing van die toepassing gebruik TestFlight.

Voorvereistes vir aflaai is die tipe App Store-ondertekeningprofiel en die teenwoordigheid van gegenereerde API-sleutels.

Daar is verskeie maniere om die toepassing af te laai:

  • via Xcode (organiseerder),
  • via altool,
  • via Application Loader vir ouer weergawes van Xcode (nou Transporter).

Vir outomatiese aflaai word altool gebruik, wat ook twee magtigingsmetodes het:

  • Programspesifieke wagwoord,
  • API sleutel.

Dit is verkieslik om die toepassing af te laai met die API-sleutel.

Om die API-sleutel te kry, gaan na skakel en genereer 'n sleutel. Benewens die sleutel self in *.p8-formaat, benodig ons twee parameters: UitreikerID en SleutelID.

Kenmerke van samestelling en aflewering van iOS-toepassings

Voer dan die afgelaaide sleutel na die boubediener in:

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

Voordat u die toepassing na TestFlight oplaai, moet u die toepassing bekragtig, ons doen dit met die opdrag:

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

waar apiKey и apiIssuer het veldwaardes van die API-sleutelgenerasiebladsy.

Verder, na suksesvolle validering, laai ons die toepassing met die opdrag --upload-app met dieselfde parameters.

Die toepassing sal binne een of twee dae deur Apple getoets word en daarna sal dit beskikbaar wees vir eksterne toetsers: hulle sal skakels vir installasie per pos gestuur word.

Nog 'n manier om 'n toepassing deur altool af te laai, is om die App-spesifieke wagwoord te gebruik.

Om die App-spesifieke wagwoord te kry, moet jy gaan na skakel en genereer dit in die Sekuriteit-afdeling.

Kenmerke van samestelling en aflewering van iOS-toepassings

Skep dan 'n boubedienerinskrywing in die Sleutelhanger met hierdie wagwoord. Vanaf weergawe 11 van Xcode kan dit gedoen word met die opdrag:

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

Waar:

$DeveloperName - iOS-ontwikkelaarrekeningnaam wat gebruik word om by Apple-dienste aan te meld.

$AppPswd - gegenereerde app-spesifieke wagwoord.

Vervolgens kry ons die waarde van die asc-verskaffer-parameter en kontroleer die sukses van die wagwoordinvoer met die opdrag:

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

Ons kry die uitset:

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

Soos u kan sien, stem die Short Name (asc-verskaffer) waarde waarna ons soek, ooreen met die $TeamID parameter wat ons gebruik het toe ons die toepassing gebou het.

Om die toepassing in TestFlight te valideer en te laai, gebruik die opdrag:

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

As parameterwaarde -p jy kan die waarde neem $AppPswd in 'n ongeënkripteerde (eksplisiete) vorm.

Soos reeds genoem, is dit egter uit die oogpunt van prestasie beter om die API-sleutel vir altool-magtiging te kies, aangesien verskillende weergawes van Xcode sekere probleme het (“sien nie die sleutelhanger nie, magtigingsfoute tydens oplaai, ens. ).

Dit is eintlik al. Ek wens almal wat betrokke is suksesvolle bouwerk en probleemvrye vrystellings in die App Store toe.

Bron: will.com

Voeg 'n opmerking