Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠΏΠΎΠ΄Π΅Π»ΡΠΌΠ΅ ΠΎΠΏΠΈΡΠ° ΠΎΡ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠ½Π΅ΡΠΎ Π½Π° iOS ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅, ΠΊΠΎΠΉΡΠΎ Plarium Krasnodar Π΅ Π½Π°ΡΡΡΠΏΠ°Π» Π² ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ Π² CI/CD.
ΠΠ±ΡΡΠ΅Π½ΠΈΠ΅
ΠΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π΅ΠΊ, ΠΏΠΎ Π΅Π΄ΠΈΠ½ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ Π½Π°ΡΠΈΠ½ ΡΠ²ΡΡΠ·Π°Π½ Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π·Π° ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π½Π° Apple, Π²Π΅ΡΠ΅ Π΅ ΡΡΠΏΡΠ» Π΄Π° ΠΎΡΠ΅Π½ΠΈ ΠΏΡΠΎΡΠΈΠ²ΠΎΡΠ΅ΡΠΈΠ²ΠΎΡΠΎ ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ Π½Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°. Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ ΡΠ° Π½Π°Π²ΡΡΠΊΡΠ΄Π΅, ΠΎΡ ΠΌΠ΅Π½ΡΡΠΎ Π½Π° ΠΏΡΠΎΡΠΈΠ»Π° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡΠ° Π΄ΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈΡΠ΅ Π·Π° ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ ΠΈ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅.
Π ΠΌΡΠ΅ΠΆΠ°ΡΠ° ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠ°ΡΠΈΠΈ Π·Π° βΠΎΡΠ½ΠΎΠ²ΠΈΡΠ΅β, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΠΏΠΎΠ΄ΡΠ΅ΡΡΠ°Π΅ΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΡΠΎ. ΠΡΠΎ ΠΊΠ°ΠΊΠ²ΠΎ Π²ΠΈ ΡΡΡΠ±Π²Π°, Π·Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ:
Π°ΠΊΠ°ΡΠ½Ρ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡ ;- ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ, Π±Π°Π·ΠΈΡΠ°Π½ΠΎ Π½Π° macOS, Π΄Π΅ΠΉΡΡΠ²Π°ΡΠΎ ΠΊΠ°ΡΠΎ ΡΡΡΠ²ΡΡ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅;
- Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈ
ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ , ΠΊΠΎΠΈΡΠΎ ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΠΊ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π° ΠΏΠΎΠ΄ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° Π·Π°ΡΠ²Π»Π΅Π½ΠΈΠ΅ΡΠΎ; - ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΡΠ½ΠΈΠΊΠ°Π»Π΅Π½
ID (Π’ΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈ Π²Π°ΠΆΠ½ΠΎΡΡΡΠ° Π½Π° Bundle Identifier, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ID ΡΡΡ Π·Π°ΠΌΠ΅ΡΡΠ²Π°Ρ Π·Π½Π°ΠΊ ΠΏΡΠ°Π²ΠΈ Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ: ΠΡΠΎΡΠΈΠΈΡΠ°Π½ΠΈ Π΄ΠΎΠΌΠ΅ΠΉΠ½ΠΈ, Push Notifications, Apple Sign In ΠΈ Π΄ΡΡΠ³ΠΈ); ΠΏΡΠΎΡΠΈΠ» ΠΏΠΎΠ΄ΠΏΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ.
Π‘Π΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡΡ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ ΡΡΠ΅Π· Keychain Π½Π° Π²ΡΡΠΊΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ Ρ macOS. ΠΠΈΠ΄ΡΡ Π½Π° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΠΆΠ΅Π½. Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΡΡΠ΅Π΄Π°ΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ (Dev, QA, Staging, Production), ΡΡ ΡΠ΅ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π° (ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ ΠΈΠ»ΠΈ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅), ΠΊΠ°ΠΊΡΠΎ ΠΈ ΡΠΈΠΏΠ° Π½Π° ΠΏΡΠΎΡΠΈΠ»Π° Π·Π° ΠΏΠΎΠ΄ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ.
ΠΡΠ½ΠΎΠ²Π½ΠΈ Π²ΠΈΠ΄ΠΎΠ²Π΅ ΠΏΡΠΎΡΠΈΠ»ΠΈ:
- Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° - ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π·Π° ΠΏΠΎΠ΄ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π΅ΠΊΠΈΠΏΠ° Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡΡ Π·Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° (ΠΈΠΌΠ΅ Π½Π° ΡΠΈΠΏΠ° iPhone Developer: XXXXX);
- Ad Hoc - ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π·Π° ΠΏΠΎΠ΄ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΡΠ΅ΡΡΠΎΠ²ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΡΡΡΠ΅ΡΠ½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΎΡ QA ΠΎΡΠ΄Π΅Π»Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° Π·Π° ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° (ΠΈΠΌΠ΅ Π½Π° ΡΠΈΠΏΠ° iPhone Distribution: XXXXX);
- App Store Π΅ Π²Π΅ΡΡΠΈΡ Π½Π° Π²Π΅ΡΡΠΈΡ Π·Π° Π²ΡΠ½ΡΠ½ΠΎ ΡΠ΅ΡΡΠ²Π°Π½Π΅ ΡΡΠ΅Π· TestFlight ΠΈ ΠΊΠ°ΡΠ²Π°Π½Π΅ Π² App Store, ΠΊΠ°ΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ Π·Π° ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ.
ΠΡΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠ΅ Development ΠΈ Ad Hoc ΡΡΡΠΎ ΡΠ΅ ΠΏΠΎΡΠΎΡΠ²Π°
ΠΠ° ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠ° ΡΡΠ½ΠΎΡΠ° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΠ΅ ΠΏΡΠΎΡΠΈΠ»Π° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΡΠ°Π±Π»ΠΈΡΠ° ΠΏΠΎ-Π΄ΠΎΠ»Ρ. Π’ΠΎΠ²Π° ΡΠ»Π΅ΡΠ½ΡΠ²Π° ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ΡΠΎ ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π·Π° ΡΠ³Π»ΠΎΠ±ΠΊΠ°ΡΠ° Π½ΠΈ ΡΡΡΠ±Π²Π°Ρ ΠΈ ΠΎΡΠΊΡΠ΄Π΅ Π΄Π° Π³ΠΈ Π²Π·Π΅ΠΌΠ΅ΠΌ.
ΠΌΠΎΠ½ΡΠ°ΠΆ
ΠΠ° Π΄Π° ΡΠ»Π΅ΡΠ½ΠΈΠΌ ΡΠ°Π·Π΄Π΅Π»ΡΠ½Π΅ΡΠΎ Π½Π° ΡΠ±ΠΎΡΠΊΠΈΡΠ΅ ΠΏΠΎ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈ ΡΡΠ΅Π΄Π°, Π½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΈΠΌΠ΅Π½Π°ΡΠ° Π½Π° ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠ΅ Π½Π° ΡΠΎΡΠΌΠ°ΡΠ° ${ProjectName}_${Instance}
, ΡΠΎΠ΅ΡΡ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° + Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ (Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΡΡΠ΅Π΄Π°ΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ: Dev, QA, GD, Staging, Live ΠΈ Ρ.Π½.).
ΠΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠ° Π² ΡΡΡΠ²ΡΡΠ° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅, ΠΏΡΠΎΡΠΈΠ»ΡΡ ΠΏΡΠΎΠΌΠ΅Π½Ρ ΠΈΠΌΠ΅ΡΠΎ ΡΠΈ Π½Π° ΡΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΈ ΡΠ΅ ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ²Π° Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ° /Users/$Username/Library/MobileDevice/Provisioning Profiles
(ΠΡΠ΄Π΅ΡΠΎ $Username
ΡΡΠ²ΠΏΠ°Π΄Π° Ρ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈΡ Π°ΠΊΠ°ΡΠ½Ρ Π½Π° ΡΡΡΠ²ΡΡΠ° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅).
ΠΠΌΠ° Π΄Π²Π° Π½Π°ΡΠΈΠ½Π° Π·Π° ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ Π½Π° *.ipa ΡΠ°ΠΉΠ»Π° - ΠΎΡΡΠ°ΡΡΠ» (PackageApplication) ΠΈ ΠΌΠΎΠ΄Π΅ΡΠ΅Π½ (ΡΡΠ΅Π· ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ ΠΈ Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°Π½Π΅ Π½Π° XcAchive). ΠΡΡΠ²ΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄ ΡΠ΅ ΡΡΠΈΡΠ° Π·Π° ΠΎΡΡΠ°ΡΡΠ», ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΌΠΎΠ΄ΡΠ»ΡΡ Π·Π° ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π΅ ΠΏΡΠ΅ΠΌΠ°Ρ
Π½Π°Ρ ΠΎΡ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Xcode ΠΎΡ Π²Π΅ΡΡΠΈΡ 8.3. ΠΠ° Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅, ΡΡΡΠ±Π²Π° Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»Π° ΠΎΡ ΡΡΠ°ΡΠΈΡ 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: 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
- ΠΌΠ΅ΡΠΎΠ΄ Π½Π° Π΄ΠΎΡΡΠ°Π²ΠΊΠ°, ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π° Π½Π° ΡΠΈΠΏΠ° Π½Π° ΠΏΡΠΎΡΠΈΠ»Π° Π½Π° ΠΏΠΎΠ΄ΠΏΠΈΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, Ρ.Π΅. Π·Π° Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°, Π·Π° Ad Hoc - ad-hoc, Π° Π·Π° App Store - ΠΌΠ°Π³Π°Π·ΠΈΠ½ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
$BundleID
- ID Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΏΠΎΡΠΎΡΠ²Π° Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°:
defaults read $ProjectDir/Info CFBundleIdentifier
$DevAccName ΠΈ $ProfileId
- ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π·Π° ID Π½Π° ΠΏΡΠΎΡΠΈΠ»Π° Π½Π° ΠΏΠΎΠ΄ΠΏΠΈΡΠ°, ΠΊΠΎΠΈΡΠΎ ΡΠ° Π±ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΠΏΡΠ΅Π΄ΠΈ ΡΠΎΠ²Π° ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π°Ρ Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π·Π° Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°Π½Π΅.
$TeamID
- Π΄Π΅ΡΠ΅ΡΡΠΈΡΡΠ΅Π½ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π² ΡΠΊΠΎΠ±ΠΈ ΡΠ»Π΅Π΄ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ: iPhone Developer: ...... (XXXXXXXXXX); ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈ Π² Keychain.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π·Π° Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°Π½Π΅, ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡ * .ipa ΡΠ°ΠΉΠ»:
xcodebuild
-exportArchive
-archivePath $ProjectDir/build/$ProjectName.xcarchive
-exportPath $ProjectDir
-exportOptionsPlist $ExportSettings
ΠΠΎΡΡΠ°Π²ΠΊΠ°
Π‘Π΅Π³Π° ΡΠ³Π»ΠΎΠ±Π΅Π½ΠΈΡΡ ΡΠ°ΠΉΠ» ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΠ°Π²Π΅Π½ Π½Π° ΠΊΡΠ°ΠΉΠ½ΠΈΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π», ΡΠΎΠ΅ΡΡ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΡΠΎ.
ΠΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠ»ΡΠ³ΠΈ Π·Π° ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈ ad hoc ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΠΈ, ΠΊΠ°ΡΠΎ HockeyApp, AppBlade ΠΈ Π΄ΡΡΠ³ΠΈ, Π½ΠΎ Π² ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠ΅ ΡΡΡΡΠ΅Π΄ΠΎΡΠΎΡΠΈΠΌ Π²ΡΡΡ Ρ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»Π΅Π½ ΡΡΡΠ²ΡΡ Π·Π° ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° iOS ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π½Π° 2 Π΅ΡΠ°ΠΏΠ°:
- ΠΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠ° Π·Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΡΠ΅Π· ΡΡΠ»ΡΠ³Π°ΡΠ° Items.
- ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°ΠΉΠ»Π° *.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 (ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΎΡ),
- ΡΡΠ΅Π· altool,
- ΡΡΠ΅Π· Application Loader Π·Π° ΠΏΠΎ-ΡΡΠ°ΡΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° Xcode (ΡΠ΅Π³Π° Transporter).
ΠΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° altool, ΠΊΠΎΠΉΡΠΎ ΡΡΡΠΎ ΠΈΠΌΠ° Π΄Π²Π° ΠΌΠ΅ΡΠΎΠ΄Π° Π·Π° ΠΎΡΠΎΡΠΈΠ·Π°ΡΠΈΡ:
- ΠΠ°ΡΠΎΠ»Π° Π·Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅,
- API ΠΊΠ»ΡΡ.
ΠΠ° ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Π½Π΅ Π΅ Π΄Π° ΠΈΠ·ΡΠ΅Π³Π»ΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΡΠ΅Π· API ΠΊΠ»ΡΡΠ°.
ΠΠ° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ API ΠΊΠ»ΡΡΠ°, ΠΎΡΠΈΠ΄Π΅ΡΠ΅ Π½Π°
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΈΠΌΠΏΠΎΡΡΠΈΡΠ°ΠΉΡΠ΅ ΠΈΠ·ΡΠ΅Π³Π»Π΅Π½ΠΈΡ ΠΊΠ»ΡΡ Π² ΡΡΡΠ²ΡΡΠ° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅:
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
ΡΡΡ ΡΡΡΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ.
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΡΠ΅ΡΡΠ²Π°Π½ΠΎ ΠΎΡ Apple Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° Π΅Π΄ΠΈΠ½ ΠΈΠ»ΠΈ Π΄Π²Π° Π΄Π½ΠΈ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΡΡΠ°Π½Π΅ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Π·Π° Π²ΡΠ½ΡΠ½ΠΈ ΡΠ΅ΡΡΠ΅ΡΠΈ: ΡΠ΅ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Ρ Π²ΡΡΠ·ΠΊΠΈ Π·Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ ΠΏΠΎ ΠΏΠΎΡΠ°ΡΠ°.
ΠΡΡΠ³ Π½Π°ΡΠΈΠ½ Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΡΠ΅Π· altool Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΏΠ°ΡΠΎΠ»Π°ΡΠ° Π·Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
ΠΠ° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΏΠ°ΡΠΎΠ»Π°ΡΠ° Π·Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΡΠΈΠ΄Π΅ΡΠ΅ Π½Π°
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΠ·Π΄Π°ΠΉΡΠ΅ Π·Π°ΠΏΠΈΡ Π½Π° ΡΡΡΠ²ΡΡ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π² Keychain Ρ ΡΠ°Π·ΠΈ ΠΏΠ°ΡΠΎΠ»Π°. ΠΡ Π²Π΅ΡΡΠΈΡ 11 Π½Π° Xcode ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°:
xcrun altool --store-password-in-keychain-item "Altool" -u "$DeveloperName" -p $AppPswd
ΠΡΠ΄Π΅:
$DeveloperName
β ΠΠΌΠ΅ Π½Π° Π°ΠΊΠ°ΡΠ½Ρ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π½Π° iOS, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΎ Π·Π° Π²Π»ΠΈΠ·Π°Π½Π΅ Π² ΡΡΠ»ΡΠ³ΠΈΡΠ΅ Π½Π° Apple.
$AppPswd
- Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π° ΠΏΠ°ΡΠΎΠ»Π° Π·Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° asc-provider ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅ ΡΡΠΏΠ΅Ρ Π° Π½Π° ΠΈΠΌΠΏΠΎΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΏΠ°ΡΠΎΠ»Π° Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°:
xcrun altool --list-providers -u "$DeveloperName" -p "@keychain:Altool"
ΠΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ°:
Provider listing:
- Long Name - - Short Name -
XXXXXXX XXXXXXXXX
ΠΠ°ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅, ΠΆΠ΅Π»Π°Π½Π°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ Π·Π° ΠΊΡΠ°ΡΠΊΠΎ ΠΈΠΌΠ΅ (asc-provider) ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π° Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° $TeamID, ΠΊΠΎΠΉΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ΅ ΠΏΡΠΈ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ.
ΠΠ° Π΄Π° ΠΏΠΎΡΠ²ΡΡΠ΄ΠΈΡΠ΅ ΠΈ Π·Π°ΡΠ΅Π΄ΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π² TestFlight, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°:
xcrun altool
--(validate|upload)-app
-f $(find "$ProjectDir" -name "*.ipa")
-u "$DeveloperName"
-p "@keychain:Altool"
ΠΠ°ΡΠΎ ΡΡΠΎΠΉΠ½ΠΎΡΡ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° -p
ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²Π·Π΅ΠΌΠ΅ΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° $AppPswd
Π² Π½Π΅ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π° (ΡΠ²Π½Π°) ΡΠΎΡΠΌΠ°.
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΠΊΠ°ΠΊΡΠΎ Π²Π΅ΡΠ΅ Π±Π΅ΡΠ΅ ΡΠΏΠΎΠΌΠ΅Π½Π°ΡΠΎ, ΠΎΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π΅ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ API ΠΊΠ»ΡΡΠ° Π·Π° ΠΎΡΠΎΡΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π½Π° Xcode ΠΈΠΌΠ°Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ (βΠ½Π΅ Π²ΠΈΠΆΠ΄Π°β Keychain, Π³ΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈ ΠΎΡΠΎΡΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΈ ΠΊΠ°ΡΠ²Π°Π½Π΅ ΠΈ Ρ.Π½. ).
Π’ΠΎΠ²Π° Π²ΡΡΡΠ½ΠΎΡΡ Π΅ Π²ΡΠΈΡΠΊΠΎ. ΠΠΎΠΆΠ΅Π»Π°Π²Π°ΠΌ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΡΠ°ΡΡΠ²Π°ΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΠΈ ΠΈ Π±Π΅Π·ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ Π² App Store.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com