Karakteristikat e ndërtimit dhe shpërndarjes së aplikacioneve iOS

Në këtë artikull, ne ndajmë përvojën e montimit dhe dërgimit të aplikacioneve iOS për përdoruesit, të cilat studio Plarium Krasnodar ka grumbulluar në procesin e korrigjimit të CI/CD.

Karakteristikat e ndërtimit dhe shpërndarjes së aplikacioneve iOS

Trajnimi

Çdo person që në një mënyrë ose në një tjetër është i përfshirë në zhvillimin e aplikacioneve për pajisjet Apple e ka vlerësuar tashmë komoditetin e diskutueshëm të infrastrukturës. Vështirësitë gjenden kudo: nga menyja e profilit të zhvilluesit deri te mjetet e korrigjimit dhe ndërtimit.

Ka shumë artikuj në lidhje me "bazat" në internet, kështu që ne do të përpiqemi të nxjerrim në pah gjënë kryesore. Ja çfarë ju nevojitet për të ndërtuar me sukses aplikacionin tuaj:

  • llogaria e zhvilluesit;
  • një pajisje e bazuar në macOS që vepron si një server ndërtimi;
  • gjeneruar certifikatën e zhvilluesit, e cila do të përdoret më tej për nënshkrimin e aplikacionit;
  • aplikacion i krijuar me unik ID (Rëndësia e Identifikuesit të Paketës duhet të theksohet, sepse përdorimi i ID-së së karakterit wild e bën të pamundur përdorimin e shumë funksioneve të aplikacionit, për shembull: Domenet e lidhura, Njoftimet Push, Hyrja në Apple dhe të tjera);
  • profil nënshkrimet e aplikacionit.

Një certifikatë zhvilluesi duhet të gjenerohet nëpërmjet Keychain në çdo pajisje macOS. Lloji i certifikatës është shumë i rëndësishëm. Në varësi të mjedisit të aplikacionit (Dev, QA, Skenari, Prodhimi) do të ndryshojë (Zhvillimi ose Shpërndarja), si dhe lloji i profilit të nënshkrimit të aplikacionit.

Llojet kryesore të profileve:

  • Zhvillimi - i destinuar për nënshkrimin e aplikacionit të ekipit të zhvillimit, përdoret një certifikatë Zhvillimi (emri i llojit iPhone Developer: XXXXX);
  • Ad Hoc - i destinuar për nënshkrimin e një aplikacioni testimi dhe verifikimin e brendshëm nga departamenti i QA, përdoret certifikata e shpërndarjes së zhvilluesit (emri i tipit iPhone Distribution: XXXXX);
  • App Store - versioni i lëshimit për testim të jashtëm nëpërmjet TestFlight dhe ngarkimi në App Store, përdoret certifikata e shpërndarjes së zhvilluesit.

Gjatë gjenerimit të profileve të Zhvillimit dhe Ad Hoc, tregohet gjithashtu listën e pajisjeve, mbi të cilin mund të instaloni një ndërtim, i cili ju lejon të kufizoni më tej aksesin për përdoruesit. Nuk ka asnjë listë të pajisjeve në profilin e App Store, pasi kontrolli i aksesit gjatë testimit të mbyllur beta trajtohet nga TestFlight, i cili do të diskutohet më vonë.

Për qartësi, mund të paraqisni profilin e zhvilluesit në formën e një tabele më poshtë. Kjo e bën më të lehtë të kuptojmë se cilat parametra na duhen për montim dhe nga t'i marrim ato.

Karakteristikat e ndërtimit dhe shpërndarjes së aplikacioneve iOS

asamble

Për ta bërë më të lehtë ndarjen e asambleve sipas projektit dhe mjedisit, ne përdorim emrat e profileve si p.sh ${ProjectName}_${Instance}, domethënë emri i projektit + shembulli (varet nga mjedisi i aplikacionit: Dev, QA, GD, Staging, Live, e kështu me radhë).

Kur importohet në serverin e ndërtimit, profili ndryshon emrin e tij në një ID unike dhe zhvendoset në dosje /Users/$Username/Library/MobileDevice/Provisioning Profiles (ku $Username korrespondon me emrin e llogarisë së përdoruesit të serverit të ndërtimit).

Ka dy mënyra për të ndërtuar një skedar *.ipa - trashëgimi (PackageApplication) dhe moderne (përmes krijimit dhe eksportit të XcAchive). Metoda e parë konsiderohet e vjetëruar, pasi që nga versioni 8.3, moduli i paketimit të skedarëve të aplikacionit është hequr nga shpërndarja Xcode. Për ta përdorur atë, duhet të kopjoni modulin nga Xcode i vjetër (versioni 8.2 dhe më i hershëm) në dosje:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

Dhe pastaj ekzekutoni komandën:

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

Më pas ju duhet të mbledhni skedarin *.app të aplikacionit:

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

Ku:

-workspace - rruga për në skedarin e projektit.

-scheme — skema e përdorur, e specifikuar në projekt.

-derivedDataPath — rruga për të shkarkuar aplikacionin e montuar (*.app).

CODE_SIGN_IDENTITY — emri i llogarisë së zhvilluesit, i cili mund të verifikohet në Keychain (Zhvilluesi i iPhone: XXXX XXXXXXX, pa TeamID në kllapa).

Karakteristikat e ndërtimit dhe shpërndarjes së aplikacioneve iOS

PROVISIONING_PROFILE — ID e profilit për nënshkrimin e aplikacionit, i cili mund të merret me komandën:

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

Nëse aplikacioni përdor një profil shtesë (për shembull, për Push Notifications), atëherë në vend të PROVISIONING_PROFILE tregoni:

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

Më pas, skedari *.app që rezulton duhet të paketohet në *.ipa. Për ta bërë këtë, mund të përdorni një komandë si:

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

Megjithatë, kjo metodë konsiderohet e vjetëruar nga këndvështrimi i Apple. Është e rëndësishme të merrni *.ipa duke eksportuar nga arkivi i aplikacionit.

Së pari ju duhet të mbledhni arkivin me komandën:

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

Dallimet qëndrojnë në metodën e montimit dhe opsionet SYNCHRONOUS_SYMBOL_PROCESSING, i cili çaktivizon shkarkimin e simboleve në kohën e ndërtimit.

Më pas duhet të gjenerojmë një skedar me cilësimet e eksportit:

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

Ku:

$Method — mënyra e dorëzimit, korrespondon me llojin e profilit të nënshkrimit të aplikacionit, domethënë, për Zhvillim vlera do të jetë zhvillimi, për Ad Hoc - ad-hoc, dhe për App Store - App-store.

$BundleID — ID-ja e aplikacionit, e cila specifikohet në cilësimet e aplikacionit. Mund të kontrolloni me komandën:

defaults read $ProjectDir/Info CFBundleIdentifier

$DevAccName и $ProfileId — Cilësimet e ID-së të emrit të zhvilluesit dhe të profilit të nënshkrimit që janë përdorur më parë dhe duhet të përputhen me vlerat në cilësimet e eksportit.

$TeamID — ID dhjetëshifrore në kllapa pas emrit të zhvilluesit, shembull: Zhvilluesi i iPhone: …… (XXXXXXXXXX); mund të kontrollohet në Keychain.

Më pas, duke përdorur komandën e eksportit, marrim skedarin e nevojshëm *.ipa:

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

Shpërndarje

Tani skedari i mbledhur duhet t'i dorëzohet përdoruesit fundor, domethënë të instalohet në pajisje.

Ka shumë shërbime për shpërndarjen e ndërtimeve të Zhvillimit dhe Ad Hoc, si HockeyApp, AppBlade dhe të tjera, por në këtë artikull do të flasim për një server të pavarur për shpërndarjen e aplikacioneve.

Instalimi i aplikacionit për iOS bëhet në 2 faza:

  1. Marrja e manifestit të instalimit të aplikacionit përmes Shërbimit të Artikujve.
  2. Instalimi i skedarit *.ipa sipas informacionit të specifikuar në manifest përmes HTTPS.

Kështu, së pari duhet të gjenerojmë një manifest instalimi (lloji i skedarit *.plist) me komandën:

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

Siç mund ta shihni, manifesti përmban pothuajse të gjithë parametrat e përfshirë në ndërtimin e aplikacionit.

Versioni i aplikacionit ($AppVersion) mund të kontrollohet me komandën:

defaults read $ProjectDir/Info CFBundleVersion

Parametër $ipaUrl përmban një lidhje të drejtpërdrejtë për të shkarkuar skedarin *.ipa. Nga versioni i shtatë i iOS, aplikacioni duhet të instalohet nëpërmjet HTTPS. Në versionin e tetë, formati i manifestit ka ndryshuar pak: blloqe me cilësime për ikonat e aplikacioneve si

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

Kështu, për të instaluar aplikacionin, mjafton një faqe e thjeshtë HTML me një lidhje si kjo:

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

Për nevojat e departamenteve të zhvillimit dhe testimit, Plarium ka krijuar aplikacionin e vet të instalimit të ndërtimit, i cili na jep:

  • autonominë dhe pavarësinë,
  • centralizimi i kontrollit të aksesit dhe instalimi i sigurt i aplikacioneve përmes lidhjeve "të përkohshme" të krijuara në mënyrë dinamike,
  • funksionalitet i zgjerueshëm (d.m.th., ekipi i zhvillimit, nëse është e nevojshme, mund të integrojë funksionet që mungojnë në një aplikacion ekzistues).

Testimi

Tani do të flasim për testimin para publikimit të aplikacionit duke përdorur TestFlight.

Kushtet e kërkuara për shkarkim janë lloji i profilit të nënshkrimit të App Store dhe prania e çelësave të gjeneruar API.

Ka disa mënyra për të shkarkuar aplikacionin:

  • nëpërmjet Xcode (Organizator),
  • me anë të mjetit,
  • nëpërmjet Application Loader për versionet më të vjetra të Xcode (tani Transporter).

Për shkarkimin automatik, përdoret altool, i cili gjithashtu ka dy metoda autorizimi:

  • Fjalëkalimi specifik për aplikacionin,
  • Çelësi API.

Preferohet të shkarkoni aplikacionin duke përdorur çelësin API.

Për të marrë çelësin API, shkoni te lidhje dhe gjeneroni një çelës. Përveç vetë çelësit në formatin *.p8, do të na duhen dy parametra: IssuerID dhe KeyID.

Karakteristikat e ndërtimit dhe shpërndarjes së aplikacioneve iOS

Tjetra, importoni çelësin e shkarkuar në serverin e ndërtimit:

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

Para se të ngarkoni aplikacionin në TestFlight, duhet të vërtetoni aplikacionin, ne e bëjmë këtë me komandën:

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

ku apiKey и apiIssuer keni vlerat e fushës nga faqja e gjenerimit të çelësave API.

Më pas, pas vërtetimit të suksesshëm, ne ngarkojmë aplikacionin me komandën --upload-app me të njëjtat parametra.

Aplikacioni do të testohet nga Apple brenda një ose dy ditësh dhe më pas do të bëhet i disponueshëm për testuesit e jashtëm: atyre do t'u dërgohen lidhje me email për instalim.

Një mënyrë tjetër për të shkarkuar një aplikacion përmes altool është përdorimi i Fjalëkalimit specifik të aplikacionit.

Për të marrë fjalëkalimin specifik të aplikacionit, duhet të shkoni te lidhje dhe gjeneroni atë në seksionin e Sigurisë.

Karakteristikat e ndërtimit dhe shpërndarjes së aplikacioneve iOS

Më pas, duhet të krijoni një rekord të serverit të ndërtuar në Keychain me këtë fjalëkalim. Nga versioni 11 i Xcode kjo mund të bëhet me komandën:

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

Ku:

$DeveloperName — emri i llogarisë së zhvilluesit iOS që përdoret për të hyrë në shërbimet e Apple.

$AppPswd — Fjalëkalimi specifik i krijuar për aplikacionin.

Më pas, marrim vlerën e parametrit të ofruesit asc dhe kontrollojmë suksesin e importimit të fjalëkalimit me komandën:

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

Ne marrim rezultatin:

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

Siç mund ta shihni, vlera e kërkuar e Short Name (asc-provider) përkon me parametrin $TeamID që kemi përdorur gjatë ndërtimit të aplikacionit.

Për të vërtetuar dhe ngarkuar aplikacionin në TestFlight, përdorni komandën:

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

Si vlerë parametri -p ju mund të merrni vlerën $AppPswd në formë të pakriptuar (të qartë).

Sidoqoftë, siç u përmend tashmë, nga pikëpamja e performancës, është më mirë të zgjidhni çelësin API për autorizimin altool, pasi versione të ndryshme të Xcode kanë probleme të caktuara ("nuk e sheh" Keychain, gabime autorizimi gjatë ngarkimit, etj.).

Kjo është e gjitha, në fakt. I uroj të gjithëve të përfshirë në ndërtime të suksesshme dhe lëshime pa probleme në App Store.

Burimi: www.habr.com

Shto një koment