Awọn ẹya ara ẹrọ ti ile ati jiṣẹ awọn ohun elo iOS

Ninu nkan yii, a pin iriri ti apejọ ati jiṣẹ awọn ohun elo iOS si awọn olumulo, eyiti ile-iṣere Plarium Krasnodar ti ṣajọpọ ninu ilana ti n ṣatunṣe aṣiṣe CI/CD.

Awọn ẹya ara ẹrọ ti ile ati jiṣẹ awọn ohun elo iOS

Igbaradi

Gbogbo eniyan ti o wa ni ọna kan tabi omiiran ti o ni ipa ninu idagbasoke awọn ohun elo fun awọn ẹrọ Apple ti tẹlẹ riri irọrun ariyanjiyan ti awọn amayederun. Awọn iṣoro ni a rii nibi gbogbo: lati inu akojọ profaili idagbasoke si yokokoro ati awọn irinṣẹ kọ.

Ọpọlọpọ awọn nkan wa nipa “awọn ipilẹ” lori Intanẹẹti, nitorinaa a yoo gbiyanju lati ṣe afihan ohun akọkọ. Eyi ni ohun ti o nilo lati kọ ohun elo rẹ ni aṣeyọri:

  • Olùgbéejáde iroyin;
  • ẹrọ orisun macOS ti n ṣiṣẹ bi olupin kikọ;
  • ti ipilẹṣẹ ijẹrisi developer, eyi ti yoo ṣee lo siwaju sii lati fowo si ohun elo naa;
  • da ohun elo pẹlu oto ID (pataki ti idanimọ Bundle yẹ ki o ṣe akiyesi, nitori lilo ID wildcard jẹ ki o ṣee ṣe lati lo ọpọlọpọ awọn iṣẹ ti ohun elo, fun apẹẹrẹ: Awọn ibugbe ti o ni ibatan, Awọn iwifunni Titari, Wọle Apple ati awọn miiran);
  • profaili awọn ibuwọlu ohun elo.

Ijẹrisi olupilẹṣẹ gbọdọ jẹ ipilẹṣẹ nipasẹ Keychain lori eyikeyi ẹrọ macOS. Iru ijẹrisi jẹ pataki pupọ. Da lori agbegbe ohun elo (Dev, QA, Staging, Production) yoo yato (Idagbasoke tabi Pinpin), gẹgẹbi iru profaili Ibuwọlu ohun elo.

Awọn oriṣi akọkọ ti awọn profaili:

  • Idagbasoke - ti a pinnu fun wíwọlé ohun elo ti ẹgbẹ idagbasoke, a lo ijẹrisi Idagbasoke (iru orukọ iPhone Olùgbéejáde: XXXX);
  • Ad Hoc - ti a pinnu fun wíwọlé ohun elo idanwo kan ati ijẹrisi inu nipasẹ Ẹka QA, ijẹrisi Pinpin ti olupilẹṣẹ ti lo (iru orukọ Pipin iPhone: XXXX);
  • Ohun elo itaja - kikọ idasilẹ fun idanwo ita nipasẹ TestFlight ati ikojọpọ si Ile-itaja Ohun elo, ijẹrisi Pipin ti olupilẹṣẹ ti lo.

Nigbati o ba n ṣe ipilẹṣẹ Idagbasoke ati awọn profaili Ad Hoc, o tun tọka si ẹrọ akojọ, lori eyi ti o le fi sori ẹrọ kan Kọ, eyi ti o faye gba o lati siwaju ni ihamọ wiwọle fun awọn olumulo. Ko si atokọ ti awọn ẹrọ ninu profaili App Store, niwọn igba ti iṣakoso iwọle lakoko idanwo beta ti o ni pipade jẹ itọju nipasẹ TestFlight, eyiti yoo jiroro nigbamii.

Fun asọye, o le ṣafihan profaili ti olupilẹṣẹ ni irisi tabili ni isalẹ. Eyi jẹ ki o rọrun lati ni oye kini awọn aye ti a nilo fun apejọ ati ibiti o ti le gba wọn.

Awọn ẹya ara ẹrọ ti ile ati jiṣẹ awọn ohun elo iOS

Apejọ

Lati jẹ ki o rọrun lati ya awọn apejọ sọtọ nipasẹ iṣẹ akanṣe ati agbegbe, a lo awọn orukọ profaili bii ${ProjectName}_${Instance}, iyẹn ni, orukọ iṣẹ akanṣe + apẹẹrẹ (da lori agbegbe ohun elo: Dev, QA, GD, Staging, Live, ati bẹbẹ lọ).

Nigbati o ba gbe wọle si olupin kikọ, profaili yi orukọ rẹ pada si ID alailẹgbẹ ati gbe lọ si folda naa /Users/$Username/Library/MobileDevice/Provisioning Profiles (Nibo $Username ni ibamu si orukọ akọọlẹ olumulo ti olupin kọ).

Awọn ọna meji lo wa lati kọ faili * .ipa - julọ (PackageApplication) ati igbalode (nipasẹ ẹda XcAchive ati okeere). Ọna akọkọ ni a gba pe o jẹ ti atijo, niwọn igba ti ẹya 8.3 ti yọkuro module iṣakojọpọ faili app lati pinpin Xcode. Lati lo, o nilo lati daakọ module lati Xcode atijọ (ẹya 8.2 ati tẹlẹ) si folda:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

Ati lẹhinna ṣiṣẹ aṣẹ naa:

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

Nigbamii o nilo lati gba * .app faili ti ohun elo naa:

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

Nibo ni:

-workspace - ọna si faili ise agbese.

-scheme - eto ti a lo, pato ninu ise agbese.

-derivedDataPath - ọna lati ṣe igbasilẹ ohun elo ti o pejọ (* .app).

CODE_SIGN_IDENTITY - orukọ ti akọọlẹ idagbasoke, eyiti o le rii daju ni Keychain (Olùgbéejáde iPhone: XXXX XXXXXXX, laisi TeamID ni awọn biraketi).

Awọn ẹya ara ẹrọ ti ile ati jiṣẹ awọn ohun elo iOS

PROVISIONING_PROFILE - ID profaili fun wíwọlé ohun elo naa, eyiti o le gba pẹlu aṣẹ naa:

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

Ti ohun elo naa ba lo profaili afikun (fun apẹẹrẹ, fun Awọn iwifunni Titari), lẹhinna dipo PROVISIONING_PROFILE tọkasi:

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

Nigbamii ti, abajade * .app faili yẹ ki o wa ni akopọ sinu * .ipa. Lati ṣe eyi, o le lo aṣẹ bii:

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

Sibẹsibẹ, ọna yii ni a gba pe o jẹ igba atijọ lati oju wiwo Apple. O ṣe pataki lati gba * .ipa nipasẹ gbigbejade lati ibi ipamọ ohun elo.

Ni akọkọ o nilo lati gba iwe-ipamọ pẹlu aṣẹ:

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

Awọn iyatọ wa ni ọna apejọ ati awọn aṣayan SYNCHRONOUS_SYMBOL_PROCESSING, eyi ti o mu awọn aami unloading ni akoko kikọ.

Nigbamii ti a nilo lati ṣe ina faili kan pẹlu awọn eto okeere:

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

Nibo ni:

$Method - ọna ifijiṣẹ, ni ibamu si iru profaili Ibuwọlu ohun elo, iyẹn ni, fun Idagbasoke iye yoo jẹ idagbasoke, fun Ad Hoc - ad-hoc, ati fun Ile-itaja Ohun elo - itaja itaja.

$BundleID - ID ohun elo, eyiti o jẹ pato ninu awọn eto ohun elo. O le ṣayẹwo pẹlu aṣẹ naa:

defaults read $ProjectDir/Info CFBundleIdentifier

$DevAccName и $ProfileId - Orukọ olupilẹṣẹ ati awọn eto ID profaili ibuwọlu ti a lo tẹlẹ ati pe o gbọdọ baamu awọn iye ninu awọn eto okeere.

$TeamID - ID oni-nọmba mẹwa ni awọn biraketi lẹhin orukọ olupilẹṣẹ, apẹẹrẹ: Olùgbéejáde iPhone: …… (XXXXXXXXX); le ṣe ayẹwo ni Keychain.

Nigbamii, ni lilo pipaṣẹ okeere, a gba faili * .ipa pataki:

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

ifijiṣẹ

Bayi faili ti o gba ni lati fi jiṣẹ si olumulo ipari, iyẹn ni, fi sori ẹrọ lori ẹrọ naa.

Ọpọlọpọ awọn iṣẹ wa fun pinpin Idagbasoke ati awọn ile Ad Hoc, gẹgẹbi HockeyApp, AppBlade ati awọn omiiran, ṣugbọn ninu nkan yii a yoo sọrọ nipa olupin ti o ni imurasilẹ fun pinpin awọn ohun elo.

Fifi ohun elo fun iOS waye ni awọn ipele meji:

  1. Ngba fifi sori ohun elo farahan nipasẹ Iṣẹ Awọn ohun kan.
  2. Fifi sori ẹrọ * .ipa faili ni ibamu si alaye ti o pato ninu ifihan nipasẹ HTTPS.

Nitorinaa, a nilo akọkọ lati ṣe agbekalẹ ifihan fifi sori ẹrọ (iru faili * .plist) pẹlu aṣẹ naa:

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

Bii o ti le rii, iṣafihan naa ni o fẹrẹ to gbogbo awọn paramita ti o kopa ninu kikọ ohun elo naa.

Ẹya ohun elo ($AppVersion) le ṣe ayẹwo pẹlu aṣẹ:

defaults read $ProjectDir/Info CFBundleVersion

Apaadi $ipaUrl ni ọna asopọ taara lati ṣe igbasilẹ faili * .ipa. Lati ẹya keje ti iOS, ohun elo naa gbọdọ fi sii nipasẹ HTTPS. Ni ẹya kẹjọ, ọna kika ti iṣafihan ti yipada diẹ: awọn bulọọki pẹlu awọn eto fun awọn aami ohun elo bii

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

Nitorinaa, lati fi ohun elo naa sori ẹrọ, oju-iwe HTML ti o rọrun pẹlu ọna asopọ bii eyi ti to:

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

Fun awọn iwulo ti idagbasoke ati awọn apa idanwo, Plarium ti ṣẹda ohun elo fifi sori ẹrọ tirẹ, eyiti o fun wa:

  • ominira ati ominira,
  • Aarin ti iṣakoso iwọle ati fifi sori aabo ti awọn ohun elo nipasẹ awọn ọna asopọ “ibùgbé” ti o ṣẹda ni agbara,
  • iṣẹ ṣiṣe ti o gbooro (eyini ni, ẹgbẹ idagbasoke, ti o ba jẹ dandan, le ṣepọ awọn iṣẹ ti o padanu sinu ohun elo ti o wa tẹlẹ).

Igbeyewo

Bayi a yoo sọrọ nipa idanwo idasilẹ iṣaaju ti ohun elo nipa lilo Idanwo idanwo.

Awọn ipo ti a beere fun igbasilẹ jẹ iru profaili ibuwọlu itaja itaja ati wiwa awọn bọtini API ti ipilẹṣẹ.

Awọn ọna pupọ lo wa lati ṣe igbasilẹ ohun elo naa:

  • nipasẹ Xcode (Ọganaisa),
  • nipasẹ altool,
  • nipasẹ Agberu Ohun elo fun awọn ẹya agbalagba ti Xcode (bayi Transporter).

Fun igbasilẹ laifọwọyi, a lo altool, eyiti o tun ni awọn ọna aṣẹ meji:

  • Ọrọigbaniwọle kan-app,
  • API Key.

O dara julọ lati ṣe igbasilẹ ohun elo naa ni lilo Key API.

Lati gba bọtini API, lọ si ọna asopọ ati ina bọtini. Ni afikun si bọtini funrararẹ ni ọna kika * .p8, a yoo nilo awọn aye meji: IssuerID ati KeyID.

Awọn ẹya ara ẹrọ ti ile ati jiṣẹ awọn ohun elo iOS

Nigbamii, gbe bọtini igbasilẹ wọle si olupin kikọ:

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

Ṣaaju ikojọpọ ohun elo naa si TestFlight, o nilo lati fọwọsi ohun elo naa, a ṣe eyi pẹlu aṣẹ naa:

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

Nibo apiKey и apiIssuer ni awọn iye aaye lati oju-iwe iran bọtini API.

Nigbamii, lori aṣeyọri aṣeyọri, a gbe ohun elo naa pẹlu aṣẹ naa --upload-app pẹlu awọn paramita kanna.

Ohun elo naa yoo ni idanwo nipasẹ Apple laarin ọjọ kan tabi meji ati lẹhinna yoo wa fun awọn idanwo ita: wọn yoo jẹ awọn ọna asopọ imeeli fun fifi sori ẹrọ.

Ọna miiran lati ṣe igbasilẹ ohun elo nipasẹ altool ni lati lo Ọrọigbaniwọle-Pato App.

Lati gba Ọrọigbaniwọle-Pato App o nilo lati lọ si ọna asopọ ki o si ṣe ina rẹ ni apakan Aabo.

Awọn ẹya ara ẹrọ ti ile ati jiṣẹ awọn ohun elo iOS

Nigbamii, o yẹ ki o ṣẹda igbasilẹ igbasilẹ olupin ni Keychain pẹlu ọrọ igbaniwọle yii. Lati ẹya 11 ti Xcode eyi le ṣee ṣe pẹlu aṣẹ:

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

Nibo ni:

$DeveloperName - orukọ ti akọọlẹ olupilẹṣẹ iOS ti a lo lati wọle si awọn iṣẹ Apple.

$AppPswd - ti ipilẹṣẹ App-Pato Ọrọigbaniwọle.

Nigbamii, a gba iye ti paramita olupese asc ati ṣayẹwo aṣeyọri ti agbewọle ọrọ igbaniwọle pẹlu aṣẹ naa:

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

A gba abajade:

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

Bii o ti le rii, iye Orukọ Kukuru ti a beere (olupese asc-olupese) ṣe deede pẹlu paramita $ TeamID ti a lo nigba kikọ ohun elo naa.

Lati fọwọsi ati gbe ohun elo sinu TestFlight, lo aṣẹ naa:

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

Bi iye paramita -p o le gba iye $AppPswd ni unencrypted (ko boju mu) fọọmu.

Bibẹẹkọ, bi a ti sọ tẹlẹ, lati oju iwo iṣẹ, o dara lati yan Key API fun aṣẹ altool, nitori awọn ẹya oriṣiriṣi ti Xcode ni awọn iṣoro kan (“ko rii” Keychain, awọn aṣiṣe aṣẹ lakoko gbigbe, bbl).

Iyẹn ni gbogbo, ni otitọ. Mo fẹ ki gbogbo eniyan kopa ninu awọn iṣelọpọ aṣeyọri ati awọn idasilẹ ti ko ni wahala ninu Ile itaja App.

orisun: www.habr.com

Fi ọrọìwòye kun