«Разбираемся в вопросе сборки приложений на разные площадки»
🕒 Время прочтения: 4 минуты
${ProjectName}_${Instance}
/Users/$Username/Library/MobileDevice/Provisioning Profiles
$Username
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/
chmod +x /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/*
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//'
APP_PROFILE=”$AppProfile” \\
EXTENSION_PROFILE=”$ExtProfile” \\
/usr/bin/xcrun --sdk iphoneos PackageApplication \\
-v $(find "$ProjectDir/build/Build/Products/Release-iphoneos" -name "*.app") \\
-o "$ProjectDir/$ProjectName_$Instance.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
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.
xcodebuild \\
-exportArchive \\
-archivePath $ProjectDir/build/$ProjectName.xcarchive \\
-exportPath $ProjectDir \\
-exportOptionsPlist $ExportSettings
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
defaults read $ProjectDir/Info CFBundleVersion
<images>
<image>...</image>
</images>
mkdir -p ~/.appstoreconnect/private_keys
mv ~/Downloads/AuthKey_${KeyID}.p8 ~/.appstoreconnect/private_keys/
xcrun altool \\
--validate-app \\
-t ios \\
-f $(find "$ProjectDir" -name "*.ipa") \\
--apiKey “$KeyID” \\
--apiIssuer “$IssuerID”
xcrun altool --store-password-in-keychain-item "Altool" -u "$DeveloperName" -p $AppPswd
$DeveloperName — имя аккаунта iOS-разработчика,
используемое для логина в сервисы Apple.
$AppPswd — сгенерированный App-Specific Password.
xcrun altool --list-providers -u "$DeveloperName" -p "@keychain:Altool"
Provider listing:
- Long Name - - Short Name -
XXXXXXX XXXXXXXXX
xcrun altool \\
--(validate|upload)-app \\
-f $(find "$ProjectDir" -name "*.ipa") \\
-u "$DeveloperName" \\
-p "@keychain:Altool" \\
Чтобы поменять язык консоли на русский, откройте страницу своегогугл-аккаунта. Зайдите в раздел Data & Personalisation в меню слева. В поисковой строке наберите language, нажмите Enter. На открывшейся странице нажмите на стрелочку в поле «Русский» и обновите Google Play Console.