Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ Π΄Π΅Π»ΠΈΠΌΡΡ ΠΎΠΏΡΡΠΎΠΌ ΡΠ±ΠΎΡΠΊΠΈ ΠΈ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π΄Π»Ρ iOS, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°ΠΊΠΎΠΏΠΈΠ»ΡΡ Ρ ΡΡΡΠ΄ΠΈΠΈ Plarium Krasnodar Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΎΡΠ»Π°Π΄ΠΊΠΈ CI/CD.
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ°
ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊ, ΡΠ°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°ΡΠ΅ ΡΠ²ΡΠ·Π°Π½Π½ΡΠΉ Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π΄Π»Ρ ΡΡΡΡΠΎΠΉΡΡΠ² Apple, ΡΠΆΠ΅ ΡΡΠΏΠ΅Π» ΠΎΡΠ΅Π½ΠΈΡΡ ΡΠΏΠΎΡΠ½ΠΎΠ΅ ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ. Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΠΈ Π²ΡΡΡΠ΅ΡΠ°ΡΡΡΡ ΠΏΠΎΠ²ΡΡΠ΄Ρ: Π½Π°ΡΠΈΠ½Π°Ρ Ρ ΠΌΠ΅Π½Ρ ΠΏΡΠΎΡΠΈΠ»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΈ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΈ ΡΠ±ΠΎΡΠΊΠΈ.
Π‘ΡΠ°ΡΠ΅ΠΉ ΠΎΠ± Β«Π°Π·Π°Ρ Β» ΠΏΡΠ΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π² ΡΠ΅ΡΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠΎΡΡΠ°ΡΠ°Π΅ΠΌΡΡ Π²ΡΠ΄Π΅Π»ΠΈΡΡ Π³Π»Π°Π²Π½ΠΎΠ΅. ΠΠΎΡ ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ Π΄Π»Ρ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΉ ΡΠ±ΠΎΡΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
Π°ΠΊΠΊΠ°ΡΠ½Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ;- ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ Π½Π° Π±Π°Π·Π΅ macOS, Π²ΡΡΡΡΠΏΠ°ΡΡΠ΅Π΅ Π² ΡΠΎΠ»ΠΈ Π±ΠΈΠ»Π΄-ΡΠ΅ΡΠ²Π΅ΡΠ°;
- ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ
ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° , ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Π΄Π°Π»Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ; - ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΌ
ID (ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΡΠΌΠ΅ΡΠΈΡΡ Π²Π°ΠΆΠ½ΠΎΡΡΡ Bundle Identifier, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ wildcard ID Π΄Π΅Π»Π°Π΅Ρ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ: Associated Domains, Push Notifications, Apple Sign In ΠΈ ΠΏΡΠΎΡΠΈΡ ); ΠΏΡΠΎΡΠΈΠ»Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
Π‘Π΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΡΠ΅Π· Keychain Π½Π° Π»ΡΠ±ΠΎΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²Π΅ Π½Π° Π±Π°Π·Π΅ macOS. ΠΡΠ΅Π½Ρ Π²Π°ΠΆΠ½ΡΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΠΏ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°. Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΡΠ΅Π΄Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (Dev, QA, Staging, Production) ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΡΠ°Π·Π»ΠΈΡΠ°ΡΡΡΡ (Development ΠΈΠ»ΠΈ Distribution), ΡΠ°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ ΡΠΈΠΏ ΠΏΡΠΎΡΠΈΠ»Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΠΈΠΏΡ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ:
- Development β ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Development-ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ (ΠΈΠΌΡ Π²ΠΈΠ΄Π° iPhone Developer: XXXXX);
- Ad Hoc β ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ QA-ΠΎΡΠ΄Π΅Π»ΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Distribution-ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° (ΠΈΠΌΡ Π²ΠΈΠ΄Π° iPhone Distribution: XXXXX);
- App Store β ΡΠ΅Π»ΠΈΠ·Π½ΡΠΉ Π±ΠΈΠ»Π΄ Π΄Π»Ρ Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅ΡΠ΅Π· TestFlight ΠΈ Π²ΡΠ³ΡΡΠ·ΠΊΠΈ Π² App Store, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Distribution-ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°.
ΠΡΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ Development ΠΈ Ad Hoc ΡΠ°ΠΊΠΆΠ΅ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ
ΠΠ»Ρ Π½Π°Π³Π»ΡΠ΄Π½ΠΎΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ ΠΏΡΠΎΡΠΈΠ»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° Π² Π²ΠΈΠ΄Π΅ ΡΠ°Π±Π»ΠΈΡΠΊΠΈ Π½ΠΈΠΆΠ΅. Π’Π°ΠΊ ΠΏΡΠΎΡΠ΅ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ½Ρ ΠΈ ΠΎΡΠΊΡΠ΄Π° ΠΈΡ Π±ΡΠ°ΡΡ.
Π‘Π±ΠΎΡΠΊΠ°
Π§ΡΠΎΠ±Ρ Π±ΡΠ»ΠΎ ΠΏΡΠΎΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΡΡΡ ΡΠ±ΠΎΡΠΊΠΈ ΠΏΠΎ ΠΏΡΠΎΠ΅ΠΊΡΡ ΠΈ ΡΡΠ΅Π΄Π΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΈΠΌΠ΅Π½Π° ΠΏΡΠΎΡΠΈΠ»Π΅ΠΉ Π²ΠΈΠ΄Π° ${ProjectName}_${Instance}
, ΡΠΎ Π΅ΡΡΡ ΠΈΠΌΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° + ΠΈΠ½ΡΡΠ°Π½Ρ (Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΡΠ΅Π΄Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ: Dev, QA, GD, Staging, Live ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅).
ΠΡΠΈ ΠΈΠΌΠΏΠΎΡΡΠ΅ Π½Π° Π±ΠΈΠ»Π΄-ΡΠ΅ΡΠ²Π΅Ρ ΠΏΡΠΎΡΠΈΠ»Ρ ΠΌΠ΅Π½ΡΠ΅Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π½Π° ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ID ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΡΡΡ Π² ΠΏΠ°ΠΏΠΊΡ /Users/$Username/Library/MobileDevice/Provisioning Profiles
(Π³Π΄Π΅ $Username
ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΠΈΠΌΠ΅Π½ΠΈ ΡΡΠ΅ΡΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π±ΠΈΠ»Π΄-ΡΠ΅ΡΠ²Π΅ΡΠ°).
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π΄Π²Π° ΡΠΏΠΎΡΠΎΠ±Π° ΡΠ±ΠΎΡΠΊΠΈ ΡΠ°ΠΉΠ»Π° *.ipa β ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠΉ (PackageApplication) ΠΈ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ (ΡΠ΅ΡΠ΅Π· ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ XcAchive ΠΈ ΡΠΊΡΠΏΠΎΡΡ). ΠΠ΅ΡΠ²ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΡΠΈΡΠ°Π΅ΡΡΡ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠΌ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Ρ Π²Π΅ΡΡΠΈΠΈ 8.3 ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ app-ΡΠ°ΠΉΠ»Π° ΡΠ±ΡΠ°Π½ ΠΈΠ· Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²Π° Xcode. ΠΠ»Ρ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π½Π°Π΄ΠΎ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΈΠ· ΡΡΠ°ΡΠΎΠ³ΠΎ Xcode (Π²Π΅ΡΡΠΈΠΈ 8.2 ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠ°Π½Π½ΠΈΡ
) Π² ΠΏΠ°ΠΏΠΊΡ:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/
Π Π·Π°ΡΠ΅ΠΌ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
chmod +x /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/*
ΠΠ°Π»Π΅Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ±ΡΠ°ΡΡ *.app-ΡΠ°ΠΉΠ» ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
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
ΠΠ΄Π΅:
-workspace
β ΠΏΡΡΡ ΠΊ ΡΠ°ΠΉΠ»Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
-scheme
β ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠ°Ρ ΡΡ
Π΅ΠΌΠ°, ΡΠΊΠ°Π·Π°Π½Π½Π°Ρ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅.
-derivedDataPath
β ΠΏΡΡΡ Π²ΡΠ³ΡΡΠ·ΠΊΠΈ ΡΠΎΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (*.app).
CODE_SIGN_IDENTITY
β ΠΈΠΌΡ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π² Keychain (iPhone Developer: XXXX XXXXXXX, Π±Π΅Π· TeamID Π² ΡΠΊΠΎΠ±ΠΊΠ°Ρ
).
PROVISIONING_PROFILE
β ID ΠΏΡΠΎΡΠΈΠ»Ρ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
cd "/Users/$Username/Library/MobileDevice/Provisioning Profiles/" && find *.mobileprovision -type f | xargs grep -li ">${ProjectName}_${Instance}<" | sed -e 's/.mobileprovision//'
ΠΡΠ»ΠΈ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΡΠΎΡΠΈΠ»Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ Push Notifications), ΡΠΎ Π²ΠΌΠ΅ΡΡΠΎ PROVISIONING_PROFILE
ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ:
APP_PROFILE=β$AppProfileβ
EXTENSION_PROFILE=β$ExtProfileβ
ΠΠ°Π»Π΅Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» *.app ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠΏΠ°ΠΊΠΎΠ²Π°ΡΡ Π² *.ipa. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²ΠΈΠ΄Π°:
/usr/bin/xcrun --sdk iphoneos PackageApplication
-v $(find "$ProjectDir/build/Build/Products/Release-iphoneos" -name "*.app")
-o "$ProjectDir/$ProjectName_$Instance.ipa"
ΠΠ΄Π½Π°ΠΊΠΎ Π΄Π°Π½Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΡΠΈΡΠ°Π΅ΡΡΡ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠΌ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ Apple. ΠΠΊΡΡΠ°Π»ΡΠ½ΡΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ *.ipa ΠΏΡΡΠ΅ΠΌ ΡΠΊΡΠΏΠΎΡΡΠ° ΠΈΠ· Π°ΡΡ ΠΈΠ²Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ±ΡΠ°ΡΡ Π°ΡΡ ΠΈΠ² ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
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
ΠΡΠ»ΠΈΡΠΈΡ Π·Π°ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ ΡΠ±ΠΎΡΠΊΠΈ ΠΈ ΠΎΠΏΡΠΈΠΈ SYNCHRONOUS_SYMBOL_PROCESSING
, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΡΠΊΠ»ΡΡΠ°Π΅Ρ Π²ΡΠ³ΡΡΠ·ΠΊΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ±ΠΎΡΠΊΠΈ.
ΠΠ°Π»Π΅Π΅ Π½Π°ΠΌ Π½Π°Π΄ΠΎ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΉΠ» Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌΠΈ ΡΠΊΡΠΏΠΎΡΡΠ°:
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
ΠΠ΄Π΅:
$Method
β ΠΌΠ΅ΡΠΎΠ΄ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΠΈΠΏΡ ΠΏΡΠΎΡΠΈΠ»Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠΎ Π΅ΡΡΡ Π΄Π»Ρ Development Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ development, Π΄Π»Ρ Ad Hoc β ad-hoc, Π° Π΄Π»Ρ App Store β app-store.
$BundleID
β ID ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΊΠ°Π·Π°Π½ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
defaults read $ProjectDir/Info CFBundleIdentifier
$DevAccName ΠΈ $ProfileId
β Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΈ ID ΠΏΡΠΎΡΠΈΠ»Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ ΡΠ°Π½Π΅Π΅ ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ
ΡΠΊΡΠΏΠΎΡΡΠ°.
$TeamID
β Π΄Π΅ΡΡΡΠΈΠ·Π½Π°ΡΠ½ΡΠΉ ID Π² ΡΠΊΠΎΠ±ΠΊΠ°Ρ
ΠΏΠΎΡΠ»Π΅ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°, ΠΏΡΠΈΠΌΠ΅Ρ: iPhone Developer: β¦β¦ (XXXXXXXXXX); ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π² Keychain.
ΠΠ°Π»Π΅Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΠΊΡΠΏΠΎΡΡΠ° ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΉ ΡΠ°ΠΉΠ» *.ipa:
xcodebuild
-exportArchive
-archivePath $ProjectDir/build/$ProjectName.xcarchive
-exportPath $ProjectDir
-exportOptionsPlist $ExportSettings
ΠΠΎΡΡΠ°Π²ΠΊΠ°
Π’Π΅ΠΏΠ΅ΡΡ ΡΠΎΠ±ΡΠ°Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΡΠΎ Π΅ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ.
ΠΠ»Ρ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΡ Π±ΠΈΠ»Π΄ΠΎΠ² Development ΠΈ Ad Hoc ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² Π²ΡΠΎΠ΄Π΅ HockeyApp, AppBlade ΠΈ ΠΏΡΠΎΡΠΈΡ , ΠΎΠ΄Π½Π°ΠΊΠΎ Π² ΡΠ°ΠΌΠΊΠ°Ρ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠΈ ΡΠ΅ΡΡ ΠΏΠΎΠΉΠ΄Π΅Ρ ΠΎΠ± Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΠΎΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅ Π΄Π»Ρ ΡΠ°Π·Π΄Π°ΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ iOS ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ Π² 2 ΡΡΠ°ΠΏΠ°:
- ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠ° ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ΅ΡΠ΅Π· Items Service.
- Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ°ΠΉΠ»Π° *.ipa ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ, ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π² ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠ΅, ΡΠ΅ΡΠ΅Π· HTTPS.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π½Π°ΠΌ Π΄Π»Ρ Π½Π°ΡΠ°Π»Π° Π½Π°Π΄ΠΎ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ (ΡΠΈΠΏ ΡΠ°ΠΉΠ»Π° *.plist) ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
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
ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΠΌ, ΠΌΠ°Π½ΠΈΡΠ΅ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΡΡΠ°ΡΡΠ²ΡΡΡΠΈΠ΅ Π² ΡΠ±ΠΎΡΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΠ΅ΡΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ($AppVersion
) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
defaults read $ProjectDir/Info CFBundleVersion
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ $ipaUrl
ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΡΡΠΌΡΡ ΡΡΡΠ»ΠΊΡ Π½Π° ΡΠΊΠ°ΡΠΈΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° *.ipa. Π‘ ΡΠ΅Π΄ΡΠΌΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ iOS ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ ΡΠ΅ΡΠ΅Π· HTTPS. Π Π²ΠΎΡΡΠΌΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΡΡ ΡΠΎΡΠΌΠ°Ρ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠ°: Π±ΡΠ»ΠΈ ΡΠ΄Π°Π»Π΅Π½Ρ Π±Π»ΠΎΠΊΠΈ Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌΠΈ ΠΈΠΊΠΎΠ½ΠΎΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π²ΠΈΠ΄Π°
<images>
<image>...</image>
</images>
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎΠΉ html-ΡΡΡΠ°Π½ΠΈΡΡ ΡΠΎ ΡΡΡΠ»ΠΊΠΎΠΉ Π²ΠΈΠ΄Π°:
itms-services://?action=download-manifest&url=https://$ServerUrl/$ProjectName/$Instance/iOS/$AppVersion/manifest.plist
ΠΠ»Ρ Π½ΡΠΆΠ΄ ΠΎΡΠ΄Π΅Π»ΠΎΠ² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ Plarium ΡΠΎΠ·Π΄Π°Π»Π° ΡΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π±ΠΈΠ»Π΄ΠΎΠ², ΠΊΠΎΡΠΎΡΠΎΠ΅ Π΄Π°Π΅Ρ Π½Π°ΠΌ:
- Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΠΎΡΡΡ ΠΈ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ,
- ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΡΠ΅ΡΠ΅Π· Β«Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅Β», Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ ΡΡΡΠ»ΠΊΠΈ,
- ΡΠ°ΡΡΠΈΡΡΠ΅ΠΌΡΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» (ΡΠΎ Π΅ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅).
Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
Π’Π΅ΠΏΠ΅ΡΡ ΡΠ΅ΡΡ ΠΏΠΎΠΉΠ΄Π΅Ρ ΠΎ ΠΏΡΠ΅Π΄ΡΠ΅Π»ΠΈΠ·Π½ΠΎΠΌ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ
ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌΠΈ Π΄Π»Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠ²Π»ΡΡΡΡΡ ΡΠΈΠΏ ΠΏΡΠΎΡΠΈΠ»Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ App Store ΠΈ Π½Π°Π»ΠΈΡΠΈΠ΅ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ API-ΠΊΠ»ΡΡΠ΅ΠΉ.
ΠΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
- ΡΠ΅ΡΠ΅Π· Xcode (Organizer),
- ΡΠ΅ΡΠ΅Π· altool,
- ΡΠ΅ΡΠ΅Π· Application Loader Π΄Π»Ρ ΡΡΠ°ΡΡΡ Π²Π΅ΡΡΠΈΠΉ Xcode (ΡΠ΅ΠΏΠ΅ΡΡ Transporter).
ΠΠ»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ altool, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠΎΠΆΠ΅ Π΅ΡΡΡ Π΄Π²Π° ΡΠΏΠΎΡΠΎΠ±Π° Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ:
- App-Specific Password,
- API Key.
ΠΠΎΠ»Π΅Π΅ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π°Π³ΡΡΠ·ΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ API Key.
ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ API Key ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ
ΠΠ°Π»Π΅Π΅ ΡΠΊΠ°ΡΠ°Π½Π½ΡΠΉ ΠΊΠ»ΡΡ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ Π½Π° Π±ΠΈΠ»Π΄-ΡΠ΅ΡΠ²Π΅Ρ:
mkdir -p ~/.appstoreconnect/private_keys
mv ~/Downloads/AuthKey_${KeyID}.p8 ~/.appstoreconnect/private_keys/
ΠΠ΅ΡΠ΅Π΄ Π·Π°Π³ΡΡΠ·ΠΊΠΎΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² TestFlight Π½ΡΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π΄Π΅Π»Π°Π΅ΠΌ ΡΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
xcrun altool
--validate-app
-t ios
-f $(find "$ProjectDir" -name "*.ipa")
--apiKey β$KeyIDβ
--apiIssuer β$IssuerIDβ
ΠΠ΄Π΅ apiKey
ΠΈ apiIssuer
ΠΈΠΌΠ΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ ΡΠΎ ΡΡΡΠ°Π½ΠΈΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ API-ΠΊΠ»ΡΡΠ°.
ΠΠ°Π»Π΅Π΅ ΠΏΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΉ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ Π·Π°Π³ΡΡΠ·ΠΊΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ --upload-app
c ΡΠ΅ΠΌΠΈ ΠΆΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ.
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½ΠΎ Apple Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ-Π΄Π²ΡΡ Π΄Π½Π΅ΠΉ ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΡΠ°Π½Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌ Π²Π½Π΅ΡΠ½ΠΈΠΌ ΡΠ΅ΡΡΠΈΡΠΎΠ²ΡΠΈΠΊΠ°ΠΌ: ΠΈΠΌ ΠΏΡΠΈΡΠ»ΡΡ Π½Π° ΠΏΠΎΡΡΡ ΡΡΡΠ»ΠΊΠΈ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ.
ΠΡΡΠ³ΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ΅ΡΠ΅Π· altool ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ App-Specific Password.
ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ App-Specific Password Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΏΠΎ
ΠΠ°Π»Π΅Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ Π² Keychain Π·Π°ΠΏΠΈΡΡ Π±ΠΈΠ»Π΄-ΡΠ΅ΡΠ²Π΅ΡΠ° Ρ ΡΡΠΈΠΌ ΠΏΠ°ΡΠΎΠ»Π΅ΠΌ. Π‘ 11 Π²Π΅ΡΡΠΈΠΈ Xcode ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
xcrun altool --store-password-in-keychain-item "Altool" -u "$DeveloperName" -p $AppPswd
ΠΠ΄Π΅:
$DeveloperName
β ΠΈΠΌΡ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ° iOS-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ΅ Π΄Π»Ρ Π»ΠΎΠ³ΠΈΠ½Π° Π² ΡΠ΅ΡΠ²ΠΈΡΡ Apple.
$AppPswd
β ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ App-Specific Password.
ΠΠ°Π»Π΅Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° asc-provider ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΡΡΠΏΠ΅ΡΠ½ΠΎΡΡΡ ΠΈΠΌΠΏΠΎΡΡΠ° ΠΏΠ°ΡΠΎΠ»Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
xcrun altool --list-providers -u "$DeveloperName" -p "@keychain:Altool"
ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ Π²ΡΠ²ΠΎΠ΄:
Provider listing:
- Long Name - - Short Name -
XXXXXXX XXXXXXXXX
ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΠΌ, ΠΈΡΠΊΠΎΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Short Name (asc-provider) ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ $TeamID, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΠΏΡΠΈ ΡΠ±ΠΎΡΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΠ»Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ ΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² TestFlight ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
xcrun altool
--(validate|upload)-app
-f $(find "$ProjectDir" -name "*.ipa")
-u "$DeveloperName"
-p "@keychain:Altool"
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° -p
ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ $AppPswd
Π² Π½Π΅Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Π½ΠΎΠΌ (ΡΠ²Π½ΠΎΠΌ) Π²ΠΈΠ΄Π΅.
ΠΠ΄Π½Π°ΠΊΠΎ, ΠΊΠ°ΠΊ ΡΠΆΠ΅ Π±ΡΠ»ΠΎ ΡΠΊΠ°Π·Π°Π½ΠΎ, Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ Π΄Π»Ρ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ altool Π»ΡΡΡΠ΅ Π²ΡΠ±ΡΠ°ΡΡ API Key, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π² ΡΠ°Π·Π½ΡΡ Π²Π΅ΡΡΠΈΡΡ Xcode Π²ΡΡΡΠ΅ΡΠ°ΡΡΡΡ ΡΠ΅ ΠΈΠ»ΠΈ ΠΈΠ½ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ (Β«Π½Π΅ Π²ΠΈΠ΄ΠΈΡΒ» Keychain, ΠΎΡΠΈΠ±ΠΊΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΈ Π²ΡΠ³ΡΡΠ·ΠΊΠ΅ ΠΈ ΠΏΡΠΎΡΠ΅Π΅).
ΠΠ° ΡΡΠΎΠΌ, ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, Π²ΡΠ΅. ΠΠ΅Π»Π°Ρ Π²ΡΠ΅ΠΌ ΠΏΡΠΈΡΠ°ΡΡΠ½ΡΠΌ ΡΡΠΏΠ΅ΡΠ½ΡΡ
ΡΠ±ΠΎΡΠΎΠΊ ΠΈ Π±Π΅ΡΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΡΡ
ΡΠ΅Π»ΠΈΠ·ΠΎΠ² Π² App Store.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com