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.

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:
- ;
- bazuar në pajisje macOS, duke vepruar si një server ndërtimi;
- gjeneruar , e cila do të përdoret më tej për nënshkrimin e aplikacionit;
- aplikacion i krijuar me unik (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);
- nënshkrimet e aplikacionit.
Certifikata e zhvilluesit duhet të gjenerohet nëpërmjet Keychain në çdo pajisje bazuar në macOSLloji i certifikatës është shumë i rëndësishëm. Në varësi të mjedisit të aplikacionit (Zhvillimi, QA, Staging, Prodhimi), ai do të ndryshojë (Zhvillimi ose Shpërndarja), ashtu si edhe lloji i profilit të nënshkrimit të aplikacionit.
Llojet kryesore të profileve:
- Zhvillimi â Ă«shtĂ« menduar pĂ«r nĂ«nshkrimin e aplikacionit tĂ« ekipit tĂ« zhvillimit, pĂ«rdoret njĂ« certifikatĂ« Zhvillimi (emri i llojit iPhone Zhvilluesi: XXXXX);
- Ad Hoc - i projektuar për nënshkrimin e një aplikacioni testimi dhe verifikimin e brendshëm nga departamenti i QA-së, përdoret certifikata e Shpërndarjes së zhvilluesit (emri i llojit iPhone Shpërndarja: 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 , 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.

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 (iPhone Zhvilluesi: XXXX XXXXXXX, pa ID-nĂ« e Ekipit nĂ« kllapa).

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 â njĂ« ID me dhjetĂ« shifra nĂ« kllapa pas emrit tĂ« zhvilluesit, shembull: iPhone Zhvilluesi: âŠâŠ (XXXXXXXXXX); mund tĂ« verifikohet 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 $ExportSettingsShpë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:
- Marrja e manifestit të instalimit të aplikacionit përmes Shërbimit të Artikujve.
- 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>
EOFSiç 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.plistPë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 .
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 dhe gjeneroni një çelës. Përveç vetë çelësit në formatin *.p8, do të na duhen dy parametra: IssuerID dhe KeyID.

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 dhe gjeneroni atë në seksionin e Sigurisë.

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 $AppPswdKu:
$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 XXXXXXXXXSiç 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
