Workaround for missing required app icons in iOS Shipping Build in Unreal Engine 4.18

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!

Update (May 11, 2018): The missing required iOS app icons issue has been fixed in Unreal Engine 4.19. If you can update your project to version 4.19 of Unreal Engine, then you will not need to use this workaround.


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:

  1. Make a For Distribution, Shipping build in the Engine

    1. Nothing special here; same steps you usually take for creating a Build

    2. I have used Xcode 9, 9.1, and 9.2 to make app builds, and this method works with all three

    3. 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

  2. Open the Binaries/IOS/Payload folder in your project's directory

  3. Copy or Move all files from PROJECT_NAME-IOS-Shipping.app to PROJECT_NAME.app

    1. I have had to use Terminal to move the files after updating to macOS High Sierra

  4. 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
    1. This Terminal command signs the .app bundle
  5. Copy the entire Terminal command

    1. 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

    2. 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

  6. Paste the command into Terminal

  7. Run the pasted command

    1. 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).

  8. Copy the PROJECT_NAME.app file into a directory other then the project directory

    1. I usually use the Staging Directory

  9. Make a new folder called "Payload", in the same directory you copied your PROJECT_NAME.app file into

  10. Move the PROJECT_NAME.app file into the Payload folder you just made

  11. Zip the Payload folder

  12. Change the zipped Payload folder's name to "distro_PROJECT_NAME.ipa"

    1. Make sure to use the .ipa extension, which turns the zipped folder into an iPhone app file

  13. Upload the .ipa file to TestFlight/App Store through Application Loader

  14. 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!