Hello there! For the past few months we've been having an error coming up for us when packaging our games for iOS using Unreal Engine 4. The issue is that required icon files are missing from iOS Shipping Builds, which are a requirement for any builds submitted to Apple for distribution through the App Store and/or TestFlight. Our programmer has come up with a workaround they wanted to share. We hope this helps out other UE4 developers!
Jonathan Daley here; I'm a co-founder of Nacelle Games and the studio's primary programmer. When first facing this issue I did some investigation, and discovered that after making a For Distribution Shipping Build for iOS, if you look in Binaries/IOS/Payload directory of the Project you built, there are two .app files: named PROJECT_NAME and PROJECT_NAME-IOS-Shipping.
All of the "missing" icon files are located in the PROJECT_NAME-IOS-Shipping app. If you right-click and Open Package Contents, you can see them all. Somehow, they never make it into the PROJECT_NAME.app file, which is the one copied out to the Staging Directory you picked when initiating a Build.
In order to fix the issue, what you need to do is copy the icon files into the PROJECT_NAME.app bundle, then resign PROJECT_NAME.app, and repackage it for uploading to the App Store through Application Loader.
Here are the steps I use to package iOS apps for distribution through the App Store and TestFlight:
Make a For Distribution, Shipping build in the Engine
Nothing special here; same steps you usually take for creating a Build
I have used Xcode 9, 9.1, and 9.2 to make app builds, and this method works with all three
DO NOT close the Engine until after all the steps are complete; you'll need some information from the Output Log in a few steps and closing the Engine usually clears the Output Log
Open the Binaries/IOS/Payload folder in your project's directory
Copy or Move all files from PROJECT_NAME-IOS-Shipping.app to PROJECT_NAME.app
I have had to use Terminal to move the files after updating to macOS High Sierra
Look at the Output log window in the Editor, and find a line near the end of the Build Process that begins with the following Terminal command:
/usr/bin/codesign --force --sign
- This Terminal command signs the .app bundle
Copy the entire Terminal command
the command will include a long alphanumeric key, the word "entitlements", a path to a PROJECT_NAME.app.xcent file, and a path to the PROJECT_NAME.app file
Take care that you don't get any extra new line characters when copying the command out of Output; I usually paste the copied text into a text file and remove any extra new line characters manually before moving on to the next step
Paste the command into Terminal
Run the pasted command
this will resign the PROJECT_NAME.app file (this is required since the .app bundle was modified by adding the icon files in step 3).
Copy the PROJECT_NAME.app file into a directory other then the project directory
I usually use the Staging Directory
Make a new folder called "Payload", in the same directory you copied your PROJECT_NAME.app file into
Move the PROJECT_NAME.app file into the Payload folder you just made
Zip the Payload folder
Change the zipped Payload folder's name to "distro_PROJECT_NAME.ipa"
Make sure to use the .ipa extension, which turns the zipped folder into an iPhone app file
Upload the .ipa file to TestFlight/App Store through Application Loader
That's all folks!
I've been using this workaround for the past few months to get builds onto Test Flight and into the App Store; including my studio's AR game Solitaire AR: https://itunes.apple.com/us/app/solitaire-ar/id1290932942?ls=1&mt=8
I'm really hoping for a fix to this soon, but at least this workaround works for now. Hope it helps!