αα αααα»αα’αααααααα ααΎαα ααααααααααα·αααααααααΆααααα»α αα·αα ααα αΆααααααα·ααΈ iOS αααα’αααααααΎααααΆαα αααααααΌααΈαα Plarium Krasnodar ααΆααααααΌααααα»ααα αααα»αααααΎαααΆαααααΆαααααΆααααα α»α CI/CD α
ααΆααααα α
ααα»ααααααααααΌαααααααα·ααααα»ααααααααΆααα½α α¬αααααααΆααααααααααααααΆαααααααααΉαααΆαα’αα·αααααααααααα·ααΈαααααΆααα§ααααα Apple ααΆααααααααΎααα½α α αΎαα ααααααΆαααΆααααα½αααα ααααΌαα ααααΆαααα αααααΆαα ααΆααααααααα ααΆαααααΆαααααΌαααΆαααααΎααα αααααααΈααααααα ααΈαααΊαα»αααααααα’αααα’αα·αααααα αα αΌααααα§αααααααααΆααααα α»α αα·ααααααΎαα
ααΆαα’αααααααΆα αααΎαα’αααΈ "ααΌαααααΆα" αα ααΎα’ααΈαααΊαα·α ααΌα ααααααΎαααΉαααααΆααΆαααααα·α ααΏαααααΆααα αααααΆα’αααΈαααα’αααααααΌααααααΎααααααα·ααΈααααα’ααααααααααααα
ααααΈα’αααα’αα·αααααα ;- α§ααααααααααΆαααΌαααααΆαααΎ macOS ααΎααα½ααΆαααΆαααΈααααααααΎαα
- ααΆααααααΎα
αα·ααααΆααααααα’αααα’αα·αααααα αααααΉαααααΌαααΆαααααΎαααααααααααΎααααΈα α»αα αααααααΆααΎααΆααααα»αα - ααΆααααααΎααααααα·ααΈαααααΆααααα½αααα
ID (ααΆααααααΆαααα Bundle Identifier αα½αααααααΌαααΆαααααααααΆαα ααΈαααααααΆαααααΎααααααααΆαααα½α’αααααααα½αααααΎα±ααααΆαα·αα’αΆα ααααΎαα»αααΆαααΆα αααΎααααααααααα·ααΈ α§ααΆα αααα Associated Domains, Push Notification, 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
ααααΌαααααΆααΉααααααααααΈα’αααααααΎααααΆαααααα build server)α
ααΆααα·ααΈααΈααααΆααααα»αααΆααααααΎαα―αααΆα *.ipa - αααααα·αααααα (PackageApplication) αα·αααααΎα (ααΆααααααΆααααααΎα αα·αααΆαα
αα XcAchive)α αα·ααΈααΆαααααααΈαα½αααααΌαααΆαα
αΆαααα»αααΆαααααααΎα αΎα α
αΆααααΆααααΈαααα 8.3 αααΌαα»αααα
ααα
ααα―αααΆααααααα·ααΈααααΌαααΆαααα
ααααΈααΆαα
ααα
αΆα 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
- ααααααααΆαααααααααααααΆααα
α»αα αααααααΆααΎααΆααααα»α αααα’αΆα
ααα½αααΆααααααΆααααααααΆα
cd "/Users/$Username/Library/MobileDevice/Provisioning Profiles/" && find *.mobileprovision -type f | xargs grep -li ">${ProjectName}_${Instance}<" | sed -e 's/.mobileprovision//'
ααααα·αααΎαααααα·ααΈααααΎαααααααααααα (α§ααΆα ααααααααΆααααΆαααΌαααααΉαα’αααΈααΆααααα»α) αααααΆαααααααα½ααα·αα 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 - app-storeα
$BundleID
- ααααααααΆαααααααα·ααΈ αααααααΌαααΆααααααΆαααα
αααα»αααΆαααααααααααα·ααΈα α’αααα’αΆα
αα·αα·ααααααααααΎααΆααααααααΆα
defaults read $ProjectDir/Info CFBundleIdentifier
$DevAccName ΠΈ $ProfileId
β αααααα’αααα’αα·αααααα αα·αααΆααααααααααααααΆααααααααα αααααααΆαααααααΌαααΆαααααΎααΈαα»α α αΎαααααΌαααααααΌααααααααααα
αααα»αααΆααααααααΆαα
ααα
$TeamID
β αααβαααααΆααβαααβαααααβαα
βαααα»αβααααααβαααααΆααβααΈβαααααβα’αααβα’αα·αααααα α§ααΆα αααα iPhone Developerα β¦β¦ (XXXXXXXXXX); α’αΆα
ααααΌαααΆααα·αα·ααααα
αααα»α Keychain α
αααααΆαααα αααααααΎααΆααααααααΆααΆαα αα ααΎαααα½αααΆαα―αααΆα *.ipa α αΆαααΆα αα
xcodebuild
-exportArchive
-archivePath $ProjectDir/build/$ProjectName.xcarchive
-exportPath $ProjectDir
-exportOptionsPlist $ExportSettings
ααααααΆαααΉααααααΌα
α₯α‘αΌααααα―αααΆαααααααααΌαααΆαααααΌααααααΌααα α’αααααααΎααααΆααα α»αααααα αααααΊααΆαααα‘αΎααα ααΎα§αααααα
ααΆαααααΆααααααΆα αααΎααααααΆααααΆαα ααα αΆα Development αα·α Ad Hoc build ααΌα ααΆ HockeyApp, AppBlade αα·αααααααααα ααα»αααααα αααα»αα’αααααααα ααΎαααΉααα·ααΆαα’αααΈ server standalone αααααΆααααΆαα ααα αΆααααααα·ααΈα
ααΆαααα‘αΎααααααα·ααΈαααααΆαα iOS ααααΎα‘αΎαααΆ 2 ααααΆααααΆαα
- ααΆαααα½αααΆαααΆαααα‘αΎααααααα·ααΈαααα αΆαααΆααααααααΆααααααΆαα»α
- ααΆαααα‘αΎαα―αααΆα *.ipa ααααα ααΆαααααααΆααααααΆααααααΆαααα αααα»α manifest ααΆαααα HTTPS α
ααΌα ααααααααΌαααΎαααααΌααααααΎαααΆαααα‘αΎα manifest (ααααααα―αααΆα *.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
ααΌα αααα’αααα’αΆα ααΎα manifest ααΆααααΆαααΆααααααααααΎαααααΆααα’αααααααΆαααααααααΉαααΆααααΆααααααα·ααΈα
αααααααααα·ααΈ ($AppVersion
) α’αΆα
ααααΌαααΆααα·αα·ααααααααααΎααΆααααααααΆ:
defaults read $ProjectDir/Info CFBundleVersion
αααΆαααΆαααααα $ipaUrl
ααΆααααααααΆααααΎααααΈααΆαααα―αααΆα *.ipa α α
αΆααααΈααααααΈααααΆαααΈαααααααααααααααα·ααααα·ααΆα iOS αααααα·ααΈααααΌαααααααΌαααΆαααα‘αΎαααΆαααα HTTPS α αα
αααα»αααααααΈααααΆαααΈ αααααααα manifest ααΆαααααΆααααααΌαααααα·α
α αααα»αααΆαα½αααΉαααΆαααααααααααΆααααΌαααααΆααααααα·ααΈααΌα
ααΆ
<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,
- ααΆαααααααααα·ααΈ Loader αααααΆααααααα αΆαααα Xcode (α₯α‘αΌαααα Transporter) α
αααααΆααααΆαααΆααααααααααααααααααα· altool ααααΌαααΆαααααΎ αααααααΆααα·ααΈααΆαααααα’αα»ααααΆαααΈααααααα
- ααΆααααααααΆααααΆααααΆαααααααααα·ααΈ,
- αα API α
ααΆααΆααΆααααααΎααααα»αααΆαααΆααααααααα·ααΈαααααααΎ 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
ααΆαα½αααΉααααΆαααΆααααααααΌα
ααααΆα
αααααα·ααΈααΉαααααΌαααΆαααΆαααααααααααα»αα αα»α 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
ααΌα αααα’αααα’αΆα ααΎα ααααα Short Name αααααααΌαααΆα (asc-provider) ααααααααΆααΆαα½αααΉααααΆαααΆαααααα $TeamID αααααΎαααΆαααααΎαα ααααααααΎααααααα·ααΈα
ααΎααααΈααααΎαα»ααααΆα αα·ααααα»ααααααα·ααΈαα αααα»α TestFlight ααΌαααααΎααΆααααααααΆα
xcrun altool
--(validate|upload)-app
-f $(find "$ProjectDir" -name "*.ipa")
-u "$DeveloperName"
-p "@keychain:Altool"
ααΆααααααααΆαααΆαααααα -p
α’αααα’αΆα
ααααααα $AppPswd
αααα»ααααααααα·αα’αα·αααααΈα (α
αααΆααααΆαα)α
ααααααΆαααΆααααα ααΌα αααααΆααααααΆαααα½α ααα αΎα ααΆαααααααααααΆαα’αα»αααα ααΆααΆααΆααααααΎααααα»αααΆαααααΎαααΎα API Key αααααΆααααΆαα’αα»ααααΆα altool α αΆααααΆααααΈαααααααααααα Xcode ααΆααααα αΆαα½αα ααα½α ("αα·αααΎα" Keychain ααα α»ααααα»αααΆαα’αα»ααααΆαα’αα‘α»αααααααα»αα‘αΎαααα)α
αααα αΎαααΆααΆααα’αα ααΆααα·αα αααα»αααΌαααΌαααα±ααα’ααααααααααααΆααΆαααααααααΉαααΆαααααΆαααΆαααααααααααααα αα·αααΆαα
ααααααΆααααααααΆααααα αΆαα
αααα»α App Store α
ααααα: www.habr.com