Karakteristik nan bati ak livrezon aplikasyon pou iOS

Nan atik sa a, nou pataje eksperyans nan rasanble ak livrezon aplikasyon iOS bay itilizatè yo, ki estidyo a Plarium Krasnodar te akimile nan pwosesis la nan debogaj CI / CD.

Karakteristik nan bati ak livrezon aplikasyon pou iOS

Fòmasyon

Chak moun ki nan yon fason oswa yon lòt patisipe nan devlopman aplikasyon pou aparèy Apple te deja apresye konvenyans kontwovèsyal nan enfrastrikti a. Difikilte yo jwenn tout kote: soti nan meni an pwofil pwomotè nan debug la ak zouti bati.

Gen anpil atik sou "debaz yo" sou entènèt la, kidonk nou pral eseye mete aksan sou bagay prensipal la. Men sa ou bezwen pou konstwi aplikasyon w lan avèk siksè:

  • kont pwomotè;
  • yon aparèy ki baze sou macOS aji kòm yon sèvè bati;
  • pwodwi sètifika pwomotè, ki pral plis itilize pou siyen aplikasyon an;
  • kreye aplikasyon ak inik ID (Nou ta dwe sonje enpòtans Idantifikatè Bundle a, paske itilizasyon ID wildcard fè li enposib pou itilize anpil fonksyon aplikasyon an, pou egzanp: Domèn Asosye, Notifikasyon Pouse, Apple Sign In ak lòt moun);
  • pwofil siyati aplikasyon yo.

Yon sètifika pwomotè dwe pwodwi atravè Keychain sou nenpòt aparèy macOS. Kalite sètifika a trè enpòtan. Tou depan de anviwònman aplikasyon an (Dev, QA, Staging, Pwodiksyon) li pral diferan (Devlopman oswa Distribisyon), menm jan ak kalite pwofil siyati aplikasyon an.

Kalite prensipal Des:

  • Devlopman - gen entansyon siyen aplikasyon an nan ekip devlopman an, yo itilize yon sètifika Devlopman (tip non iPhone Developer: XXXXX);
  • Ad Hoc - gen entansyon pou siyen yon aplikasyon tès ak verifikasyon entèn pa depatman QA a, yo itilize sètifika Distribisyon pwomotè a (non kalite iPhone Distribisyon: XXXXX);
  • App Store - lage bati pou tès ekstèn atravè TestFlight ak telechaje nan App Store la, yo itilize sètifika distribisyon pwomotè a.

Lè jenere Devlopman ak Ad Hoc pwofil, li endike tou lis aparèy, sou kote ou ka enstale yon bati, ki pèmèt ou plis mete restriksyon sou aksè pou itilizatè yo. Pa gen okenn lis aparèy nan pwofil App Store la, paske se TestFlight ki okipe kontwòl aksè pandan tès beta fèmen, ki pral diskite pita.

Pou klè, ou ka prezante pwofil pwomotè a nan fòm yon tablo anba a. Sa fè li pi fasil pou konprann ki paramèt nou bezwen pou asanble ak ki kote pou jwenn yo.

Karakteristik nan bati ak livrezon aplikasyon pou iOS

Asanble

Pou fè li pi fasil separe asanble pa pwojè ak anviwònman, nou itilize non pwofil tankou ${ProjectName}_${Instance}, se sa ki, non pwojè + egzanp (depann sou anviwònman aplikasyon an: Dev, QA, GD, Staging, Live, ak sou sa).

Lè yo enpòte nan sèvè bati a, pwofil la chanje non li nan yon ID inik epi li deplase nan katab la /Users/$Username/Library/MobileDevice/Provisioning Profiles (Ki kote $Username koresponn ak non kont itilizatè a nan sèvè bati a).

Gen de fason pou konstwi yon fichye *.ipa - eritaj (PackageApplication) ak modèn (via XcAchive kreyasyon ak ekspòtasyon). Premye metòd la konsidere kòm demode, depi vèsyon 8.3 modil anbalaj dosye app a te retire nan distribisyon Xcode. Pou itilize li, ou bezwen kopye modil la soti nan ansyen Xcode (vèsyon 8.2 ak pi bonè) nan katab la:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/

Apre sa, kouri lòd la:

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

Apre sa ou bezwen kolekte *.app fichye aplikasyon an:

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

Ki kote:

-workspace - chemen nan dosye pwojè a.

-scheme — konplo a itilize, espesifye nan pwojè a.

-derivedDataPath — chemen pou telechaje aplikasyon an reyini (*.app).

CODE_SIGN_IDENTITY — non kont pwomotè a, ki ka verifye nan Keychain (Devlopè iPhone: XXXX XXXXXXX, san TeamID nan parantèz).

Karakteristik nan bati ak livrezon aplikasyon pou iOS

PROVISIONING_PROFILE - ID pwofil pou siyen aplikasyon an, ki ka jwenn ak kòmandman an:

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

Si aplikasyon an sèvi ak yon pwofil adisyonèl (pa egzanp, pou Pouse Notifikasyon), Lè sa a, olye pou yo PROVISIONING_PROFILE endike:

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

Apre sa, dosye a *.app ki kapab lakòz yo ta dwe pake nan *.ipa. Pou fè sa, ou ka itilize yon lòd tankou:

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

Sepandan, metòd sa a konsidere kòm demode nan pwen de vi Apple la. Li enpòtan pou jwenn *.ipa pa ekspòte soti nan achiv aplikasyon an.

Premye ou bezwen kolekte achiv la ak lòd la:

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

Diferans yo kouche nan metòd asanble a ak opsyon SYNCHRONOUS_SYMBOL_PROCESSING, ki enfim dechaje senbòl nan moman konstriksyon.

Apre sa, nou bezwen jenere yon dosye ak anviwònman ekspòtasyon:

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

Ki kote:

$Method — metòd livrezon, koresponn ak kalite pwofil siyati aplikasyon an, se sa ki, pou Devlopman valè a pral devlopman, pou Ad Hoc - ad-hoc, ak pou App Store - app-store.

$BundleID — ID aplikasyon, ki espesifye nan paramèt aplikasyon an. Ou ka tcheke avèk kòmandman an:

defaults read $ProjectDir/Info CFBundleIdentifier

$DevAccName и $ProfileId - Non pwomotè ak paramèt ID pwofil siyati yo te itilize deja epi yo dwe matche ak valè yo nan paramèt ekspòtasyon yo.

$TeamID — ID ki gen dis chif nan parantèz apre non pwomotè a, egzanp: Pwomotè iPhone: …… (XXXXXXXXXX); ka tcheke nan Keychain.

Apre sa, lè l sèvi avèk kòmand ekspòtasyon an, nou jwenn ki nesesè *.ipa dosye a:

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

Доставка

Koulye a, dosye a kolekte bezwen yo dwe lage nan itilizatè a fen, se sa ki enstale sou aparèy la.

Gen anpil sèvis pou distribye Devlopman ak Ad Hoc bati, tankou HockeyApp, AppBlade ak lòt moun, men nan atik sa a nou pral pale sou yon sèvè otonòm pou distribye aplikasyon yo.

Enstale aplikasyon an pou iOS pran plas nan 2 etap:

  1. Resevwa manifest enstalasyon aplikasyon an atravè Sèvis atik yo.
  2. Enstalasyon fichye *.ipa a dapre enfòmasyon ki espesifye nan manifès la atravè HTTPS.

Kidonk, nou premye bezwen jenere yon manifès enstalasyon (tip fichye *.plist) ak lòd la:

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

Kòm ou ka wè, manifest la gen prèske tout paramèt ki enplike nan bati aplikasyon an.

Vèsyon aplikasyon ($AppVersion) ka tcheke avèk kòmandman an:

defaults read $ProjectDir/Info CFBundleVersion

Paramèt $ipaUrl gen yon lyen dirèk pou telechaje fichye *.ipa a. Soti nan setyèm vèsyon iOS, aplikasyon an dwe enstale atravè HTTPS. Nan wityèm vèsyon an, fòma manifest la chanje yon ti kras: blòk ak anviwònman pou ikon aplikasyon tankou

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

Kidonk, pou enstale aplikasyon an, yon senp paj HTML ak yon lyen tankou sa a ase:

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

Pou bezwen depatman devlopman ak tès yo, Plarium te kreye pwòp aplikasyon enstalasyon konstriksyon, ki ban nou:

  • otonomi ak endepandans,
  • santralizasyon kontwòl aksè ak enstalasyon an sekirite nan aplikasyon atravè lyen "tanporè" dinamik ki kreye,
  • fonksyonalite dilatabl (ki se, ekip devlopman an, si sa nesesè, ka entegre fonksyon ki manke nan yon aplikasyon ki deja egziste).

Tès

Koulye a, nou pral pale sou tès pre-lage nan aplikasyon an lè l sèvi avèk TestFlight.

Kondisyon obligatwa pou telechaje se kalite pwofil siyati App Store ak prezans kle API ki te pwodwi yo.

Gen plizyè fason pou telechaje aplikasyon an:

  • atravè Xcode (Òganizatè),
  • atravè altool,
  • atravè Charger Aplikasyon pou ansyen vèsyon Xcode (kounye a Transporter).

Pou telechaje otomatik, yo itilize altool, ki gen tou de metòd otorizasyon:

  • Modpas espesifik pou aplikasyon an,
  • Kle API.

Li pi bon pou telechaje aplikasyon an lè l sèvi avèk kle API a.

Pou jwenn kle API a, ale nan lyen epi jenere yon kle. Anplis kle a li menm nan fòma *.p8, nou pral bezwen de paramèt: IssuerID ak KeyID.

Karakteristik nan bati ak livrezon aplikasyon pou iOS

Apre sa, enpòte kle telechaje a nan sèvè bati a:

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

Anvan w telechaje aplikasyon an nan TestFlight, ou bezwen valide aplikasyon an, nou fè sa ak lòd la:

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

Ki kote apiKey и apiIssuer gen valè jaden ki soti nan paj jenerasyon kle API a.

Apre sa, apre validasyon siksè, nou chaje aplikasyon an ak lòd la --upload-app ak paramèt yo menm.

Aplikasyon an pral teste pa Apple nan youn oswa de jou epi yo pral Lè sa a, vin disponib nan tèsteur ekstèn: yo pral voye lyen imèl pou enstalasyon yo.

Yon lòt fason pou telechaje yon aplikasyon atravè altool se sèvi ak Modpas Espesifik pou aplikasyon an.

Pou jwenn Modpas Espesifik aplikasyon an ou bezwen ale nan lyen epi jenere li nan seksyon sekirite a.

Karakteristik nan bati ak livrezon aplikasyon pou iOS

Apre sa, ou ta dwe kreye yon dosye sèvè bati nan Keychain ak modpas sa a. Soti nan vèsyon 11 nan Xcode sa a ka fè ak lòd la:

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

Ki kote:

$DeveloperName — non kont pwomotè iOS yo itilize pou konekte ak sèvis Apple yo.

$AppPswd — pwodwi Modpas Espesifik pou aplikasyon an.

Apre sa, nou jwenn valè paramèt asc-founisè a epi tcheke siksè enpòte modpas la ak lòd la:

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

Nou jwenn pwodiksyon an:

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

Kòm ou ka wè, valè non kout obligatwa (asc-provider) kowenside ak paramèt $TeamID ke nou te itilize lè nou bati aplikasyon an.

Pou valide ak chaje aplikasyon an nan TestFlight, sèvi ak lòd sa a:

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

Kòm yon valè paramèt -p ou ka pran valè a $AppPswd nan fòm ki pa chifre (eksplis).

Sepandan, kòm deja mansyone, nan pwen de vi nan pèfòmans, li pi bon yo chwazi API Key pou otorizasyon altool, depi diferan vèsyon nan Xcode gen sèten pwoblèm ("pa wè" Keychain, erè otorizasyon pandan Upload, elatriye).

Sa a tout, aktyèlman. Mwen swete tout moun ki patisipe nan konstriksyon siksè ak degaje san pwoblèm nan App Store la.

Sous: www.habr.com

Add nouvo kòmantè