I’ve got it working with legacy flow finally.
- Because of strange configs merging in UE you need to disable modern signing in BaseEngine.ini in Shared Engine folder as well as in DefaultEngine.ini in project’s folder:
“/Users/Shared/Epic Games/UE_5.3/Engine/Config/BaseEngine.ini” and “$PROJECT_HOME/Config/DefaultEngine.ini”
[/Script/MacTargetPlatform.XcodeProjectSettings]
bUseModernXcode=False
bUseAutomaticCodeSigning=False
- Update Xcode and Xcode utilities if possible. We are using Xcode 15.1
- Logout from development account in Xcode.
- Install certificates and keys in Login Keychain or System Keychain depends on how you working with them and provide access for codesign and Xcode
security import certificates.p12 -k ~/Library/Keychains/login.keychain-db -t priv -P certificates_password -T /usr/bin/codesign -T /Applications/Xcode.app
security set-key-partition-list -S apple-tool:,apple:,codesign: -s ~/Library/Keychains/login.keychain-db
- Copy provisioning profiles in “~/Library/MobileDevice/Provisioning Profiles/” and name them same way as you will used in IOSRuntime settings in DefaultEngine.ini:
[/Script/IOSRuntimeSettings.IOSRuntimeSettings]
bUseModernXcode=False
bUseAutomaticCodeSigning=False
MobileProvision=com.example.project.distribution.mobileprovision
Don’t forget to set other required parameters in DefaultEngine.ini like
[/Script/IOSRuntimeSettings.IOSRuntimeSettings]
bAutomaticSigning=False
BundleIdentifier=com.example.project
BundleName=com.example.project
BundleDisplayName=ExampleProject
MobileProvision=com.example.project.distribution.mobileprovision
SigningCertificate=iPhone Distribution: Example Project Company (1234567890)
IOSTeamID=1234567890
VersionInfo=0.1
- On 5.3 in “/Users/Shared/Epic Games/UE_5.3/Engine/Source/Programs/UnrealBuildTool/Platform/IOS/UEDeployIOS.cs” they changed platform in generated plist which may prevent from successful processing on TestFlight(infinite upload processing):
492c821
< Text.AppendLine("\t\t<string>iPhoneOS</string>");
---
> Text.AppendLine("\t\t<string>iPhoneOS iPhoneSimulator</string>");
There is a parameter for extending plist content - AdditionalPlistData in '[/Script/IOSRuntimeSettings.IOSRuntimeSettings]' section of DefaultEngine.ini, which can be used to replace platform to iPhoneOS explicitly:
[/Script/IOSRuntimeSettings.IOSRuntimeSettings]
AdditionalPlistData=CFBundleSupportedPlatformsiPhoneOS
6. Using the same AdditionalPlistData you need to set CFBundleVersion concatenated from VersionInfo parameter and build number for instance:
[/Script/IOSRuntimeSettings.IOSRuntimeSettings]
AdditionalPlistData=CFBundleSupportedPlatformsiPhoneOSCFBundleVersion0.1.999
VersionInfo from '/Script/IOSRuntimeSettings.IOSRuntimeSettings' from DefaultEngine.ini is the CFBundleShortVersionString in the plist.
7. If you are using AutomationTool command to build package you need to remove archive command because it now made automatically and in case you will set it it will try to overwrite locked with write lock ipa file - remove following command line parameters:
-archive \
-archivedirectory="${PROJECT_HOME}/Binaries" \
8. Use altool for ipa deployment:
xcrun altool --upload-package “$PROJECT_HOME/Binaries/IOS/Distro_ExampleProject-IOS-Shipping.ipa”
–type IOS
–team-id 1234567890
–apple-id 987654321
–bundle-id com.example.project
–bundle-version 0.1.999
–bundle-short-version-string 0.1
–username apple_dev_user@example.com
–password 1234-5678-9876-1234
Where are:
- team-id - your apple team id from https://developer.apple.com/
- apple-id - your application id from https://appstoreconnect.apple.com/
- bundle-id - same as set in DefaultEngine.ini
- bundle-version - CFBundleVersion
- bundle-short-version-string CFBundleShortVersionString
- username and password - username and key pair from https://appstoreconnect.apple.com/access/api
I guess that's it.