Nā hiʻohiʻona o ke kūkulu ʻana a me ka hāʻawi ʻana i nā noi iOS

Ma kēia ʻatikala, kaʻana like mākou i ka ʻike o ka hōʻuluʻulu ʻana a me ka hāʻawi ʻana i nā noi iOS i nā mea hoʻohana, i hōʻiliʻili ʻia e ka studio Plarium Krasnodar i ke kaʻina hana o ka debugging CI / CD.

Nā hiʻohiʻona o ke kūkulu ʻana a me ka hāʻawi ʻana i nā noi iOS

ʻO ka hoʻomākaukauʻana

ʻO kēlā me kēia kanaka e pili ana i ka hoʻomohala ʻana i nā noi no nā polokalamu Apple ua mahalo nui i ka hoʻopaʻapaʻa kūpono o ka ʻōnaehana. Loaʻa nā pilikia ma nā wahi āpau: mai ka papa kuhikuhi mea hoʻomohala i ka debug a kūkulu i nā mea hana.

Nui nā ʻatikala e pili ana i nā "kumu" ma ka Pūnaewele, no laila e hoʻāʻo mākou e kuhikuhi i ka mea nui. Eia kāu mea e pono ai e kūkulu pono i kāu palapala noi:

  • moʻokāki hoʻomohala;
  • kahi mea hana macOS e hana ana ma ke ʻano he kikowaena kūkulu;
  • hana ʻia palapala hoʻomohala, e hoʻohana hou ʻia e kau inoa i ka palapala noi;
  • i hana ʻia me ka ʻokoʻa ID (pono e hoʻomaopopo ʻia ke koʻikoʻi o ka Bundle Identifier, no ka mea, ʻo ka hoʻohana ʻana i ka wildcard ID he mea hiki ʻole ke hoʻohana i nā hana he nui o ka noi, no ka laʻana: Associated Domains, Push Notifications, Apple Sign In a me nā mea ʻē aʻe);
  • РїїЂѕѕ „„ "СЊ palapala noi.

Pono e hana ʻia kahi palapala hoʻomohala ma o Keychain ma kekahi polokalamu macOS. He mea nui ke ʻano o ka palapala hōʻoia. Ma muli o ke kaiapuni noi (Dev, QA, Staging, Production) e ʻokoʻa (Development or Distribution), e like me ke ʻano o ka palapala inoa inoa.

ʻO nā ʻano nui o nā profiles:

  • Hoʻomohala - i manaʻo ʻia no ke kau inoa ʻana i ka noi o ka hui hoʻomohala, hoʻohana ʻia kahi palapala Hoʻomohala (type name iPhone Developer: XXXXX);
  • Ad Hoc - i manaʻo ʻia no ke kau inoa ʻana i kahi noi hoʻāʻo a me ka hōʻoia kūloko e ka ʻoihana QA, hoʻohana ʻia ka palapala hoʻolaha o ka mea hoʻomohala (type name iPhone Distribution: XXXXX);
  • App Store - hoʻokuʻu i kūkulu no ka hoʻāʻo ʻana o waho ma o TestFlight a hoʻouka i ka App Store, hoʻohana ʻia ka palapala hoʻolaha o ka mea hoʻomohala.

I ka hana ʻana i nā profiles Development a me Ad Hoc, hōʻike pū ʻia papa inoa hāmeʻa, kahi e hiki ai iā ʻoe ke hoʻokomo i kahi kūkulu, kahi e hiki ai iā ʻoe ke kaohi hou i ke komo ʻana no nā mea hoʻohana. ʻAʻohe papa inoa o nā hāmeʻa ma ka ʻaoʻao App Store, no ka mea, mālama ʻia ka mana i ka wā o ka hoʻāʻo beta pani ʻia e TestFlight, e kūkākūkā ʻia ma hope.

No ka akaka, hiki iā ʻoe ke hōʻike i ka ʻaoʻao o ka mea hoʻomohala ma ke ʻano o kahi papa ma lalo. He mea maʻalahi kēia i ka hoʻomaopopo ʻana i nā ʻāpana e pono ai mākou no ka hui ʻana a me kahi e kiʻi mai ai.

Nā hiʻohiʻona o ke kūkulu ʻana a me ka hāʻawi ʻana i nā noi iOS

Hōʻuluʻulu

I mea e maʻalahi ai ka hoʻokaʻawale ʻana i nā hui ma o ka papahana a me ke kaiapuni, hoʻohana mākou i nā inoa inoa like ${ProjectName}_${Instance}, ʻo ia hoʻi, ka inoa papahana + instance (e pili ana i ke kaiapuni noi: Dev, QA, GD, Staging, Live, a pēlā aku).

Ke lawe ʻia mai i ke kikowaena kūkulu, hoʻololi ka ʻaoʻao i kona inoa i kahi ID kūʻokoʻa a neʻe ʻia i ka waihona /Users/$Username/Library/MobileDevice/Provisioning Profiles (kahi $Username pili i ka inoa moʻokāki mea hoʻohana o ke kikowaena kūkulu).

ʻElua ala e kūkulu ai i kahi faila *.ipa - hoʻoilina (PackageApplication) a me kēia manawa (ma o XcAchive hana a hoʻokuʻu aku). Ua manaʻo ʻia ke ʻano mua he kahiko ʻole, ʻoiai mai ka mana 8.3 ua wehe ʻia ka module waihona waihona app mai ka hoʻohele Xcode. No ka hoʻohana ʻana, pono ʻoe e kope i ka module mai ka Xcode kahiko (version 8.2 a ma mua) i ka waihona:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

A laila holo i ke kauoha:

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

A laila pono ʻoe e hōʻiliʻili i ka faila *.app o ka noi:

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

ʻAuhea:

-workspace — ala i ka waihona papahana.

-scheme - ka papahana i hoʻohana ʻia, i ʻōlelo ʻia ma ka papahana.

-derivedDataPath — ala e hoʻoiho ai i ka noi i hui ʻia (*.app).

CODE_SIGN_IDENTITY — ka inoa o ka mooolelo haku, hiki ke hooiaioia ma Keychain (iPhone Developer: XXXX XXXXXXX, me ka TeamID ma na brackets).

Nā hiʻohiʻona o ke kūkulu ʻana a me ka hāʻawi ʻana i nā noi iOS

PROVISIONING_PROFILE - Profile ID no ke kau inoa ʻana i ka noi, hiki ke loaʻa me ke kauoha:

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

Inā hoʻohana ka noi i kahi ʻaoʻao hou (no ka laʻana, no Push Notifications), a laila ma kahi o PROVISIONING_PROFILE hōʻike:

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

A laila, pono e hoʻopili ʻia ka faila *.app i loko o *.ipa. No ka hana ʻana i kēia, hiki iā ʻoe ke hoʻohana i kahi kauoha e like me:

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

Eia naʻe, ua manaʻo ʻia kēia ʻano hana ʻole mai ka manaʻo o Apple. He mea pili i ka loaʻa ʻana o *.ipa ma ka lawe ʻana aku mai ka waihona palapala noi.

Pono mua ʻoe e hōʻiliʻili i ka waihona me ke kauoha:

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

Aia nā ʻokoʻa i ke ʻano hui a me nā koho SYNCHRONOUS_SYMBOL_PROCESSING, ka mea e hoʻopau i ka wehe ʻana i ka hōʻailona i ka manawa kūkulu.

A laila pono mākou e hana i kahi faila me nā hoʻonohonoho hoʻoiho:

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

ʻAuhea:

$Method - ke ʻano o ka hāʻawi ʻana, pili i ke ʻano o ka palapala inoa inoa inoa noi, ʻo ia hoʻi, no ka hoʻomohala ʻana ka waiwai e hoʻomohala ʻia, no Ad Hoc - ad-hoc, a no App Store - app-store.

$BundleID - ID ID, i kuhikuhi ʻia i nā hoʻonohonoho noi. Hiki iā ʻoe ke nānā me ke kauoha:

defaults read $ProjectDir/Info CFBundleIdentifier

$DevAccName и $ProfileId - ka inoa o ka mea hoʻomohala a me nā hoʻonohonoho ID profile pūlima i hoʻohana mua ʻia a pono e hoʻohālikelike i nā waiwai i nā hoʻonohonoho hoʻoiho.

$TeamID — ʻumi helu helu ma nā pale ma hope o ka inoa o ka mea hoʻomohala, laʻana: iPhone Developer: …… (XXXXXXXXXX); hiki ke nānā ʻia ma Keychain.

A laila, me ka hoʻohana ʻana i ke kauoha export, loaʻa iā mākou ka faila *.ipa pono:

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

Доставка

I kēia manawa pono e hāʻawi ʻia ka faila i hōʻiliʻili ʻia i ka mea hoʻohana hope, ʻo ia hoʻi, kau ʻia ma ka hāmeʻa.

Nui nā lawelawe no ka hāʻawi ʻana i ka Development a me Ad Hoc kūkulu, e like me HockeyApp, AppBlade a me nā mea ʻē aʻe, akā ma kēia ʻatikala e kamaʻilio mākou e pili ana i kahi kikowaena kūʻokoʻa no ka hāʻawi ʻana i nā noi.

Hoʻokomo ʻia ka noi no IOS ma 2 mau pae:

  1. Loaʻa i ka hōʻike hoʻonohonoho noi ma o ka Service Items.
  2. Hoʻokomo ʻia ka faila *.ipa e like me ka ʻike i hōʻike ʻia ma ka hōʻike ma o HTTPS.

No laila, pono mākou e hana mua i kahi hōʻike hoʻonohonoho (ʻano faila *.plist) me ke kauoha:

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

E like me kāu e ʻike ai, aia i ka manifest kahi kokoke i nā ʻāpana āpau e pili ana i ke kūkulu ʻana i ka noi.

Palapala noi ($AppVersion) hiki ke nānā ʻia me ke kauoha:

defaults read $ProjectDir/Info CFBundleVersion

ʻO ka pākuhi $ipaUrl loaʻa kahi loulou pololei e hoʻoiho i ka faila *.ipa. Mai ka hiku o ka mana o iOS, pono e hoʻokomo ʻia ka noi ma o HTTPS. Ma ka ʻewalu o ka mana, ua loli iki ke ʻano o ka hōʻike: nā poloka me nā hoʻonohonoho no nā kiʻi noiʻi like

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

No laila, e hoʻokomo i ka noi, ua lawa kahi palapala HTML maʻalahi me kahi loulou e like me kēia:

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

No nā pono o ka hoʻomohala ʻana a me ka hoʻāʻo ʻana, ua hana ʻo Plarium i kāna noi hoʻonohonoho kūkulu ponoʻī, e hāʻawi iā mākou:

  • kūʻokoʻa a me ke kūʻokoʻa,
  • ke kikowaena o ka mana komo a me ka hoʻonohonoho paʻa ʻana i nā noi ma o nā loulou "manawa" i hana ikaika ʻia,
  • hiki ke hoʻonui ʻia (ʻo ia hoʻi, ka hui hoʻomohala, inā pono, hiki ke hoʻohui i nā hana i nalowale i kahi noi e kū nei).

Hoʻoponopono

I kēia manawa e kamaʻilio mākou e pili ana i ka hoʻāʻo mua ʻana o ka hoʻohana ʻana i ka noi Kauike.

ʻO nā kūlana i makemake ʻia no ka hoʻoiho ʻana, ʻo ia ke ʻano o ka palapala inoa inoa App Store a me ke alo o nā kī API i hana ʻia.

Nui nā ala e hoʻoiho ai i ka polokalamu:

  • ma o Xcode (Organizer),
  • ma o altool,
  • ma o Application Loader no nā mana kahiko o Xcode (i kēia manawa ʻo Transporter).

No ka hoʻoiho maʻalahi, hoʻohana ʻia ʻo altool, ʻelua mau ala ʻae:

  • ʻO ka ʻōlelo huna no ka polokalamu,
  • Kiʻi API.

ʻOi aku ka maikaʻi o ka hoʻoiho ʻana i ka noi me ka API Key.

E kiʻi i ka API Key, e hele i loulou a hana i kahi kī. Ma waho aʻe o ke kī ponoʻī ma *.p8 format, pono mākou i ʻelua mau ʻāpana: IssuerID a me KeyID.

Nā hiʻohiʻona o ke kūkulu ʻana a me ka hāʻawi ʻana i nā noi iOS

A laila, hoʻokomo i ke kī i hoʻoiho ʻia i ke kikowaena kūkulu:

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

Ma mua o ka hoʻouka ʻana i ka noi iā TestFlight, pono ʻoe e hōʻoia i ka noi, hana mākou i kēia me ke kauoha:

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

'Ahea apiKey и apiIssuer loaʻa nā waiwai kahua mai ka ʻaoʻao hana kī API.

A laila, ma ka hōʻoia kūleʻa, hoʻouka mākou i ka noi me ke kauoha --upload-app me nā palena like.

E hoʻāʻo ʻia ka palapala noi e Apple i loko o hoʻokahi a ʻelua mau lā a laila e loaʻa i nā mea hoʻāʻo waho: e leka uila ʻia lākou i nā loulou no ka hoʻonohonoho ʻana.

ʻO kekahi ala e hoʻoiho ai i kahi noi ma o altool ʻo ia ka hoʻohana ʻana i ka ʻōlelo huna App-Specific.

No ka loaʻa ʻana o ka ʻōlelo huna App-Specific āu e hele ai loulou a hana ia ma ka pauku Security.

Nā hiʻohiʻona o ke kūkulu ʻana a me ka hāʻawi ʻana i nā noi iOS

A laila, pono ʻoe e hana i kahi moʻolelo kikowaena kūkulu ma Keychain me kēia ʻōlelo huna. Mai ka mana 11 o Xcode hiki ke hana me ke kauoha:

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

ʻAuhea:

$DeveloperName - ka inoa o ka mooolelo hoʻomohala iOS i hoʻohana ʻia e komo i nā lawelawe Apple.

$AppPswd — hana ʻia ka ʻōlelo huna App-Specific.

A laila, loaʻa iā mākou ka waiwai o ka asc-provider parameter a nānā i ka kūleʻa o ka hoʻokomo ʻana i ka password me ke kauoha:

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

Loaʻa iā mākou ka hopena:

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

E like me kāu e ʻike ai, ʻokoʻa ka waiwai o ka inoa pōkole (asc-provider) me ka ʻāpana $TeamID a mākou i hoʻohana ai i ke kūkulu ʻana i ka noi.

No ka hōʻoia a hoʻouka i ka noi i TestFlight, e hoʻohana i ke kauoha:

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

Ma ke ʻano he ʻāpana waiwai -p hiki iā ʻoe ke lawe i ka waiwai $AppPswd ma ke ano i hoopili ole ia.

Eia naʻe, e like me ka mea i haʻi mua ʻia, mai ka manaʻo o ka hana, ʻoi aku ka maikaʻi o ke koho ʻana i ka API Key no ka ʻae ʻana i ka altool, no ka mea, loaʻa i nā ʻano like ʻole o Xcode kekahi mau pilikia ("ʻaʻole ʻike" Keychain, nā hewa ʻae i ka wā hoʻouka, etc.).

ʻO ia wale nō, ʻoiaʻiʻo. Makemake au i ka poʻe a pau e pili ana i ke kūkulu kūleʻa a me ka hoʻokuʻu pilikia ʻole i ka App Store.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka