Cov yam ntxwv ntawm kev tsim thiab xa cov ntawv thov iOS

Hauv tsab xov xwm no, peb muab cov kev paub dhau los ntawm kev sib sau thiab xa cov ntawv thov iOS no rau cov neeg siv, uas Plarium Krasnodar studio tau sau rau hauv cov txheej txheem ntawm kev debugging CI / CD.

Cov yam ntxwv ntawm kev tsim thiab xa cov ntawv thov iOS

Kev cob qhia

Txhua tus neeg uas nyob hauv ib txoj kev lossis lwm qhov kev koom tes hauv kev tsim cov ntawv thov rau Apple cov khoom siv tau txaus siab rau qhov tsis txaus ntseeg yooj yim ntawm cov txheej txheem. Cov teeb meem muaj nyob txhua qhov chaw: los ntawm tus tsim tawm profile ntawv qhia zaub mov mus rau kev debug thiab tsim cov cuab yeej.

Muaj ntau ntau cov lus hais txog "cov ntsiab lus" hauv Is Taws Nem, yog li peb yuav sim qhia qhov tseem ceeb. Nov yog yam koj xav tau los tsim koj daim ntawv thov kom tiav:

  • tus tsim tawm tus account;
  • macOS-based ntaus ntawv ua tus tsim server;
  • tsim tawm tus tsim tawm daim ntawv pov thawj, uas yuav raug siv ntxiv los kos npe rau daim ntawv thov;
  • tsim daim ntawv thov nrog tshwj xeeb ID (Qhov tseem ceeb ntawm Bundle Identifier yuav tsum tau sau tseg, vim tias kev siv cov cim cim cim tsis tuaj yeem siv ntau lub luag haujlwm ntawm daim ntawv thov, piv txwv li: Associated Domains, Push Notifications, Apple Sign In thiab lwm yam);
  • profile daim ntawv sau npe.

Daim ntawv pov thawj tsim tawm yuav tsum raug tsim los ntawm Keychain ntawm txhua lub macOS ntaus ntawv. Hom ntawv pov thawj tseem ceeb heev. Nyob ntawm daim ntawv thov ib puag ncig (Dev, QA, Staging, Production) nws yuav txawv (Kev Tsim Kho lossis Kev faib tawm), raws li hom ntawv thov kos npe profile.

Lub ntsiab hom ntawm profiles:

  • Kev loj hlob - npaj rau kos npe rau daim ntawv thov ntawm pab neeg txhim kho, ib daim ntawv pov thawj Kev Txhim Kho yog siv (hom npe iPhone Developer: XXXXX);
  • Ad Hoc - npaj rau kos npe rau daim ntawv thov kev xeem thiab kev txheeb xyuas sab hauv los ntawm QA department, tus tsim tawm daim ntawv pov thawj Distribution yog siv (hom npe iPhone Distribution: XXXXX);
  • App Store - tso tawm tsim rau kev sim sab nraud ntawm TestFlight thiab xa mus rau App Store, tus tsim tawm daim ntawv pov thawj Distribution yog siv.

Thaum tsim Kev Txhim Kho thiab Ad Hoc profiles, nws kuj tau qhia ntaus ntawv, ntawm qhov uas koj tuaj yeem nruab ib qho kev tsim, uas tso cai rau koj ntxiv txwv kev nkag mus rau cov neeg siv. Tsis muaj cov npe ntawm cov khoom siv hauv App Store profile, txij li kev nkag mus rau kev tswj xyuas thaum kaw beta xeem yog tswj hwm los ntawm TestFlight, uas yuav tau tham tom qab.

Txhawm rau kom pom tseeb, koj tuaj yeem nthuav qhia tus tsim tawm profile hauv daim ntawv hauv qab no. Qhov no ua rau nws yooj yim dua kom nkag siab txog qhov peb xav tau rau kev sib dhos thiab qhov twg yuav tau txais los ntawm.

Cov yam ntxwv ntawm kev tsim thiab xa cov ntawv thov iOS

Sib dhos

Txhawm rau ua kom yooj yim rau kev sib cais los ntawm qhov project thiab ib puag ncig, peb siv cov npe profile xws li ${ProjectName}_${Instance}, uas yog, lub npe project + piv txwv (nyob ntawm qhov chaw thov: Dev, QA, GD, Staging, Live, thiab lwm yam).

Thaum imported mus rau cov neeg rau zaub mov tsim, qhov profile hloov nws lub npe mus rau ib tus ID tshwj xeeb thiab raug hloov mus rau hauv daim nplaub tshev /Users/$Username/Library/MobileDevice/Provisioning Profiles (qhov twg $Username sib raug rau tus neeg siv tus account lub npe ntawm tus tsim server).

Muaj ob txoj hauv kev los tsim cov ntaub ntawv *.ipa - legacy (PackageApplication) thiab niaj hnub (ntawm XcAchive creation thiab export). Thawj txoj kev yog suav tias yog siv tsis tau, txij li txij li version 8.3 lub app ntim cov ntaub ntawv tau raug tshem tawm ntawm Xcode tis. Txhawm rau siv nws, koj yuav tsum luam cov module los ntawm Xcode qub (version 8.2 thiab ua ntej) mus rau lub nplaub tshev:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

Thiab ces khiav qhov hais kom ua:

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

Tom ntej no koj yuav tsum sau cov ntaub ntawv *.app ntawm daim ntawv thov:

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

Qhov twg:

-workspace - txoj kev mus rau qhov project file.

-scheme - cov txheej txheem siv, teev nyob rau hauv qhov project.

-derivedDataPath - txoj kev mus rub tawm daim ntawv thov sib sau ua ke (*.app).

CODE_SIGN_IDENTITY - lub npe ntawm tus tsim tawm tus account, uas tuaj yeem txheeb xyuas tau hauv Keychain (iPhone Developer: XXXX XXXXXXX, tsis muaj TeamID nyob rau hauv brackets).

Cov yam ntxwv ntawm kev tsim thiab xa cov ntawv thov iOS

PROVISIONING_PROFILE - Profile ID rau kos npe rau daim ntawv thov, uas tuaj yeem tau txais nrog cov lus txib:

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

Yog tias daim ntawv thov siv qhov profile ntxiv (piv txwv li, rau Push Notifications), ces tsis yog PROVISIONING_PROFILE qhia:

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

Tom ntej no, cov ntaub ntawv *.app yuav tsum tau ntim rau hauv *.ipa. Txhawm rau ua qhov no, koj tuaj yeem siv cov lus txib xws li:

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

Txawm li cas los xij, txoj kev no suav hais tias tsis siv los ntawm Apple qhov kev xav. Nws yog qhov tseem ceeb kom tau txais *.ipa los ntawm kev xa tawm ntawm daim ntawv thov archive.

Ua ntej koj yuav tsum sau cov archive nrog cov lus txib:

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

Qhov sib txawv yog nyob rau hauv txoj kev sib dhos thiab kev xaiv SYNCHRONOUS_SYMBOL_PROCESSING, uas disables cim unloading ntawm lub sij hawm tsim.

Tom ntej no peb yuav tsum tsim cov ntaub ntawv nrog export chaw:

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

Qhov twg:

$Method - txoj kev xa khoom, sib raug rau daim ntawv thov kos npe profile hom, uas yog, rau Kev Txhim Kho tus nqi yuav yog kev txhim kho, rau Ad Hoc - ad-hoc, thiab rau App Store - app-store.

$BundleID - Daim Ntawv Thov ID, uas tau teev tseg hauv daim ntawv thov teeb tsa. Koj tuaj yeem tshawb xyuas nrog cov lus txib:

defaults read $ProjectDir/Info CFBundleIdentifier

$DevAccName ΠΈ $ProfileId - tus tsim tawm lub npe thiab kos npe profile ID teeb tsa uas tau siv yav dhau los thiab yuav tsum phim cov txiaj ntsig hauv qhov chaw xa tawm.

$TeamID β€” Kaum-tus lej ID nyob rau hauv pawg tom qab tus tsim tawm lub npe, piv txwv li: iPhone Tus Tsim Tawm: …… (XXXXXXXXXX); tuaj yeem tshawb xyuas hauv Keychain.

Tom ntej no, siv cov lus txib export, peb tau txais cov ntaub ntawv tsim nyog *.ipa:

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

Shipping info

Tam sim no cov ntaub ntawv khaws tseg yuav tsum tau xa mus rau tus neeg siv kawg, uas yog, ntsia ntawm lub cuab yeej.

Muaj ntau ntau cov kev pabcuam rau kev faib kev txhim kho thiab Ad Hoc tsim, xws li HockeyApp, AppBlade thiab lwm yam, tab sis hauv tsab xov xwm no peb yuav tham txog ib tus neeg rau zaub mov rau kev faib cov ntawv thov.

Txhim kho daim ntawv thov rau iOS no tshwm sim hauv 2 theem:

  1. Tau txais daim ntawv thov kev teeb tsa tshwm sim los ntawm Cov Khoom Pabcuam.
  2. Kev teeb tsa ntawm * .ipa cov ntaub ntawv raws li cov ntaub ntawv teev tseg hauv qhov manifest ntawm HTTPS.

Yog li, peb yuav tsum xub tsim ib qho kev teeb tsa manifest (cov ntaub ntawv hom *.plist) nrog cov lus txib:

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

Raws li koj tau pom, lub manifest muaj yuav luag tag nrho cov tsis muaj kev koom tes nyob rau hauv tsim daim ntawv thov.

Daim ntawv thov version ($AppVersion) tuaj yeem tshawb xyuas nrog cov lus txib:

defaults read $ProjectDir/Info CFBundleVersion

Parameter $ipaUrl muaj qhov txuas ncaj qha mus rub tawm cov ntaub ntawv *.ipa. Los ntawm lub xya version ntawm iOS no, daim ntawv thov yuav tsum tau ntsia ntawm HTTPS. Nyob rau hauv lub yim version, cov hom ntawv ntawm lub manifest tau hloov me ntsis: blocks nrog rau tej chaw rau daim ntawv thov icons nyiam

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

Yog li, txhawm rau nruab daim ntawv thov, nplooj ntawv HTML yooj yim nrog qhov txuas zoo li qhov no txaus:

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

Rau cov kev xav tau ntawm kev txhim kho thiab kev kuaj xyuas, Plarium tau tsim nws tus kheej tsim daim ntawv thov, uas muab rau peb:

  • autonomy thiab kev ywj pheej,
  • centralization ntawm kev tswj kev nkag thiab kev ruaj ntseg ntawm cov ntawv thov los ntawm "ntev" dynamically tsim txuas,
  • expandable functionality (uas yog, pab neeg txhim kho, yog tias tsim nyog, tuaj yeem sib xyaw ua haujlwm ploj mus rau hauv daim ntawv thov uas twb muaj lawm).

Kev Ntsuam Xyuas

Tam sim no peb yuav tham txog kev sim ua ntej tso tawm ntawm daim ntawv thov siv Xeem Ntsuas.

Cov xwm txheej yuav tsum tau rub tawm yog hom App Store kos npe profile thiab muaj cov yuam sij API tsim.

Muaj ntau ntau txoj hauv kev los rub tawm daim ntawv thov:

  • ntawm Xcode (Organizer),
  • ntawm altool,
  • ntawm daim ntawv thov Loader rau cov laus versions ntawm Xcode (tam sim no Transporter).

Rau kev rub tawm tsis siv neeg, altool yog siv, uas kuj muaj ob txoj kev tso cai:

  • App-Specific Password,
  • API Key.

Nws yog qhov zoo dua los rub tawm daim ntawv thov siv API Key.

Kom tau txais API Key, mus rau txuas thiab tsim kom muaj tus yuam sij. Ntxiv rau qhov tseem ceeb nws tus kheej hauv *.p8 hom, peb yuav xav tau ob qhov tsis muaj: IssuerID thiab KeyID.

Cov yam ntxwv ntawm kev tsim thiab xa cov ntawv thov iOS

Tom ntej no, import tus yuam sij downloaded rau tus tsim server:

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

Ua ntej xa daim ntawv thov mus rau TestFlight, koj yuav tsum tau lees paub daim ntawv thov, peb ua qhov no nrog cov lus txib:

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

Qhov twg apiKey ΠΈ apiIssuer muaj nuj nqis teb los ntawm API key tiam nplooj.

Tom ntej no, thaum ua tiav validation, peb thauj daim ntawv thov nrog cov lus txib --upload-app nrog tib yam tsis muaj.

Daim ntawv thov yuav raug kuaj los ntawm Apple hauv ib lossis ob hnub thiab tom qab ntawd yuav muaj rau cov neeg sim sab nraud: lawv yuav raug xa mus rau nruab los ntawm email.

Lwm txoj hauv kev los rub tawm daim ntawv thov los ntawm altool yog siv App-Specific Password.

Yuav kom tau txais App-Specific Password koj yuav tsum mus rau txuas thiab tsim nws hauv seem Security.

Cov yam ntxwv ntawm kev tsim thiab xa cov ntawv thov iOS

Tom ntej no, koj yuav tsum tsim cov ntaub ntawv tsim server hauv Keychain nrog tus password no. Los ntawm version 11 ntawm Xcode qhov no tuaj yeem ua tiav nrog cov lus txib:

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

Qhov twg:

$DeveloperName - lub npe ntawm tus tsim tawm iOS no siv los nkag rau hauv Apple cov kev pabcuam.

$AppPswd - tsim App-Specific Password.

Tom ntej no, peb tau txais tus nqi ntawm asc-provider parameter thiab xyuas qhov ua tiav ntawm tus password ntshuam nrog cov lus txib:

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

Peb tau txais cov zis:

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

Raws li koj tuaj yeem pom, tus nqi luv lub npe tus nqi (asc-provider) coincides nrog $TeamID parameter uas peb siv thaum tsim daim ntawv thov.

Txhawm rau siv tau thiab thauj daim ntawv thov mus rau TestFlight, siv cov lus txib:

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

Raws li tus nqi parameter -p koj tuaj yeem coj tus nqi $AppPswd nyob rau hauv unencrypted (paub meej) daim ntawv.

Txawm li cas los xij, raws li twb tau hais lawm, los ntawm qhov kev pom ntawm kev ua tau zoo, nws yog qhov zoo dua los xaiv API Key rau kev tso cai altool, vim ntau yam ntawm Xcode muaj qee yam teeb meem ("tsis pom" Keychain, kev tso cai yuam kev thaum upload, thiab lwm yam).

Qhov ntawd yog tag nrho, ua tau. Kuv xav kom txhua tus neeg koom nrog kev tsim ua tiav thiab tsis muaj teeb meem tso tawm hauv App Store.

Tau qhov twg los: www.hab.com

Ntxiv ib saib