Download

Developing for iOS on Windows: How To

Hello!

I’ve been working on putting together a detailed step by step directions on how to use the Unreal’s engine remote tool to develop for iOS on Windows (for Code based apps).
This feature is currently not officially supported but the tools are there if you are building from github. If you have been attempting to do this yourself, you may have been pointed to or found this link: Steps for IOS build with UnrealRemoteTool - UE4 AnswerHub. This has most of the steps, but it’s still missing some and I wanted to create something a little more clear for new people, and provide a place to discuss them.
In order to use the remote tool and develop for iOS on Windows you will need a Mac to build the code for your app. This can be really useful if for example your PC is much more powerful than your Mac. Its also cheaper to build a new PC then it is to get a new Mac of the same performance in many cases. I have an old Macbook Pro, and it can run the editor, but not nearly as well as my PC.

Steps:

Mac

  1. Open a terminal window on your Mac, and cd to the root directory.
  2. Create a new directory called UE4 at the root directory. (sudo mkdir UE4)
  3. Make sure the permissions are set for the new directory. (sudo chmod 777 UE4)
  4. Get the 4.2 Release Source Code from Github and put it in the UE4 directory you just created. (git clone --url of your fork here–)
  5. Run the UnrealRemoteTool you can find it under Engine\Build\IOS. (Note: If you can’t get it to run, try chmod a+x to make sure its permissions are set to execute).
  6. The UnrealRemoteTool could crash, so you can run it in a loop if you don’t want to watch it in the terminal type

for (( ; ; )) ; do ./UnrealRemoteTool; done

You can also save that in a shell script (.sh) to run again easily later.

  1. You also need to be sure you have installed xcode, created your developer certificate and a mobile provision. I won’t go through these steps here, as you can find much better information about this any where on the web.
  2. After you have done all the above, we need to export our developer certificate, and its private key. You can do this by opening the keychain access, finding the developer certificate you created, and its corresponding private key and exporting each one, save the file somewhere you can get it (like a thumb drive) while your at it put your mobileprovision file on it. We will need all these later on the PC.

Now what? Now the Unreal Remote Tool is listening for commands to be sent to it. The next step is configure the Unreal Engine on the Windows side.

**PC **

  1. Create a directory at the root of your drive called UE4 just as you did on the Mac.
  2. Clone the same fork 4.2 Release here. You will also need to be sure to download the two Required file zips and extract them in the appropriate folders.
  3. Create a new file in the same directory as the Engine folder and name it UE4Games.uprojectdirs. Put ‘./’ in it (without the quotations).
  4. Run the GenerateProjectFiles.bat
  5. Open the XML file in Engine\Programs\UnrealBuildTool called BuildConfiguration.xml
  6. In here we will configure the Build tool to know what server the Remote Tool is running on. Add the following under the configuration section:

RemoteToolChain>
       <PotentialServerNames>
         <Item>AlternativeServer</Item>
       </PotentialServerNames>
 
       <RemoteServerName>MacServerName</RemoteServerName>
    </RemoteToolChain>

Replace MacServerName with the name of your MAC machine name.

  1. Now open the configuration file for IPhonePackager, iphonepackager.exe.config and add the following section to the runtime: <loadFromRemoteSources enabled=“true”/>
  2. Now open \Engine\Build\IOS\ directory. Put your mobileprovision file in here. Rename it UE4Game.mobileprovision (Not sure if this rename part is necessary, I just do it for consistency).
  3. Now in the same directory open the The UE4Game-Info plist, find the CFBundleURLName. You need to change this to match the conditions set by your mobileprovision. For example, your mobileprovision might be defined as follows: com.coolawesomegames.*. That means your bundle could be anything, as long as it starts with ‘com.coolawesomegames.’ (CAREFUL HERE, sometimes when editing a file like this, you may accidentally change the encoding, this can cause issues later when loading the XML file. The encoding should be UTF-8 without a BOM. If you find later that the Build fails because of an error on the first line, position 1, this would be a good place to look first. Notepad++ makes it easy to specify the encoding before saving to ensure you are saving it in the correct encoding).
  4. Now we need to install the certificate and private key we got earlier from the MAC on to our PC. Put the files on your computer somewhere. Run the exe MMC, you can find it by searching for it. Click file at the top 'Add Remove Snap In’s, Add the Certificate Snap in, and choose the ‘My User Account’ setting and confirm. Now you should see a list of folder looking things on the left. Click the one called ‘Personal’ right click somewhere and click ‘All Tasks -> Import’. Now follow the wizard and import your certificate. After that’s complete, repeat that process only import the private key this time.
  5. Finally, open the UE4 solution and build it.
  6. Open the UE4Editor.exe found in the WIN64 binaries.
  7. Create a new code base project, be sure to uncheck the ‘Include Starter Content’.
  8. Edit -> Project Settings -> iOS -> and be sure the project is configured for IOS.
  9. Now Package Project-> iOS
  10. Wait for it…and if everything goes right, you will have a fresh IPA in the Binaries/iOS folder of your project folder. It can take a while to build, as it has to upload everything to your mac and build it.
  11. Install the IPA and test it.

And that’s it! I haven’t gotten this to work for content only applications yet. I get an error about a missing UE4Game.stub, but you can add code to a content base project to turn into a code based one (you don’t need to do anything with the code). I did this with Tappy Chicken and was able to create an IPA using the steps above.

If anyone encounters any error with the step above, feel free to post it here, it may have been one I’ve seen before because trust me I’ve seen a lot to get to this point! Lastly, only 4.2 was I able to get this to work, github version.

A few additions:

  • You don’t need to build the UE4 project itself for iOS. Building your own project works (it will compile all the necessary stuff regardless). The UE4 project seems to be intended at creating the fabled stub for content-only projects that’s not shipped with 4.2.
  • Make sure to disable “Full Rebuild” in your project’s Packaging settings (it’s a hidden setting, search for “full rebuild” to find it), otherwise your project will be recompiled from scratch again every time you package (which will take many, many minutes).

Can this be done entirely on Windows? Like buy a copy of Mac Os and put it in a Virtual Machine running on Windows. Has anyone done that?

I’m not entirely sure, but its not straight forward to run Mac OS X on a Virtual Machine. Technically its against the license, and usually you need a modified/pirated version of it. At least the last time I checked. Of course, if your ok with all of that, it should work as long as your computer can reach the server and handle running both OSes at the same time. It might just be easier to get a Mac Mini though, and use that. Since your not running the editor on it, it doesn’t need to be a beastly machine.

Yes, it works on a VM, since it’s all done by running stuff via command-line under the hood. UE4 itself won’t run on a VM, however. Even the CrashReporter crashes.

The license allows you to run OSX on a VM as long as you run in on Mac hardware, so you can bootcamp into Windows and use OSX on a VM to compile stuff. VMWare is perfectly capable of running OSX, as long as it can verify you are on a Mac.

Thanks for your tips. Where can I find “Full rebuild” option? It’s really annoy that packaging code project in windows always trigger full compile on Mac.

Hi, my build is failed with this error:

MainFrameActions: Packaging (iOS): UnrealBuildTool: [RPC] === BUILD TARGET Idol - iOS OF PROJECT UE4_FromPC WITH CONFIGURATION Development ===
MainFrameActions: Packaging (iOS): UnrealBuildTool: [RPC] Check dependencies
MainFrameActions: Packaging (iOS): UnrealBuildTool: [RPC] Write auxiliary files
MainFrameActions: Packaging (iOS): UnrealBuildTool: [RPC] /bin/mkdir -p /UE4/Builds/ROMANK-WPC1/UE4/UnrealEngine/Projects/Idol/Intermediate/IOS/build/UE4_FromPC.build/Development-iphoneos/Idol\ -\ iOS.build
MainFrameActions: Packaging (iOS): UnrealBuildTool: [RPC] write-file /UE4/Builds/ROMANK-WPC1/UE4/UnrealEngine/Projects/Idol/Intermediate/IOS/build/UE4_FromPC.build/Development-iphoneos/Idol\ -\ iOS.build/Script-BDC7F5D5259391512534FFE6.sh
MainFrameActions: Packaging (iOS): UnrealBuildTool: [RPC] chmod 0755 /UE4/Builds/ROMANK-WPC1/UE4/UnrealEngine/Projects/Idol/Intermediate/IOS/build/UE4_FromPC.build/Development-iphoneos/Idol\ -\ iOS.build/Script-BDC7F5D5259391512534FFE6.sh
MainFrameActions: Packaging (iOS): UnrealBuildTool: [RPC] ProcessInfoPlistFile /UE4/Builds/ROMANK-WPC1/UE4/UnrealEngine/Projects/Idol/Binaries/IOS/Payload/Idol.app/Info.plist /UE4/Builds/ROMANK-WPC1/UE4/UnrealEngine/Projects/Idol/Intermediate/IOS/Idol-Info.plist
MainFrameActions: Packaging (iOS): UnrealBuildTool: [RPC] cd /UE4/Builds/ROMANK-WPC1/UE4/UnrealEngine/Engine/Binaries/IOS
MainFrameActions: Packaging (iOS): UnrealBuildTool: [RPC] export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin"
MainFrameActions: Packaging (iOS): UnrealBuildTool: [RPC] builtin-infoPlistUtility /UE4/Builds/ROMANK-WPC1/UE4/UnrealEngine/Projects/Idol/Intermediate/IOS/Idol-Info.plist -genpkginfo /UE4/Builds/ROMANK-WPC1/UE4/UnrealEngine/Projects/Idol/Binaries/IOS/Payload/Idol.app/PkgInfo -expandbuil
MainFrameActions: Packaging (iOS): dsettings -format xml -platform iphoneos -resourcerulesfile /UE4/Builds/ROMANK-WPC1/UE4/UnrealEngine/Projects/Idol/Binaries/IOS/Payload/Idol.app/CustomResourceRules.plist -o /UE4/Builds/ROMANK-WPC1/UE4/UnrealEngine/Projects/Idol/Binaries/IOS/Payload/Idol.app/Info.plist
MainFrameActions: Packaging (iOS): UnrealBuildTool: [RPC] error: could not read data from ‘/UE4/Builds/ROMANK-WPC1/UE4/UnrealEngine/Projects/Idol/Intermediate/IOS/Idol-Info.plist’: The file “Idol-Info.plist” couldn’t be opened because there is no such file.
MainFrameActions: Packaging (iOS): UnrealBuildTool: [RPC] ** BUILD FAILED **
MainFrameActions: Packaging (iOS): UnrealBuildTool: IPP ERROR: Xcode build failed!
MainFrameActions: Packaging (iOS): UnrealBuildTool: [RPC] The following build commands failed:
MainFrameActions: Packaging (iOS): UnrealBuildTool: [RPC] ProcessInfoPlistFile /UE4/Builds/ROMANK-WPC1/UE4/UnrealEngine/Projects/Idol/Binaries/IOS/Payload/Idol.app/Info.plist /UE4/Builds/ROMANK-WPC1/UE4/UnrealEngine/Projects/Idol/Intermediate/IOS/Idol-Info.plist
MainFrameActions: Packaging (iOS): UnrealBuildTool: [RPC] (1 failure)
MainFrameActions: Packaging (iOS): UnrealBuildTool: IPP ERROR: RPCCommand MakeApp failed with return code 65
MainFrameActions: Packaging (iOS): UnrealBuildTool: Finished creating .app directory on Mac (took 24,74 s)
MainFrameActions: Packaging (iOS): UnrealBuildTool: Running RPC on HGSMacMini …
MainFrameActions: Packaging (iOS): UnrealBuildTool: Running RPC on HGSMacMini …
MainFrameActions: Packaging (iOS): UnrealBuildTool: … zipping
MainFrameActions: Packaging (iOS): UnrealBuildTool: … working folder: /UE4/Builds/ROMANK-WPC1/UE4/UnrealEngine/Projects/Idol/Binaries/IOS
MainFrameActions: Packaging (iOS): UnrealBuildTool: … zip -q -r -y -0 -T Idol.ipa Payload iTunesArtwork -x Payload/Idol.app.dSYM/ -x Payload/Idol.app.dSYM/* -x Payload/Idol.app.dSYM/Contents/ -x Payload/Idol.app.dSYM/Contents/* -x Payload/Idol.app.dSYM/Contents/Resources/ -x Payload/Idol.app.dSYM/Contents/Resources/* -x Payload/Idol.app.dSYM/Contents/Resources/DWARF/ -x Payload/Idol.app.dSYM/Contents/Resources/DWARF/*
MainFrameActions: Packaging (iOS): UnrealBuildTool: IPP WARNING: Error in previous command; suppressing: GetStubIPA
MainFrameActions: Packaging (iOS): UnrealBuildTool: Finished packaging into IPA (took 2,64 s)
MainFrameActions: Packaging (iOS): UnrealBuildTool: ERROR: System.Exception: [RPC] ** BUILD FAILED **IPP ERROR: Xcode build failed!IPP ERROR: RPCCommand MakeApp failed with return code 65
MainFrameActions: Packaging (iOS): UnrealBuildTool: at UnrealBuildTool.IOSToolChain.PostBuildSync(UEBuildTarget Target) in c:\UE4\UnrealEngine\Engine\Source\Programs\UnrealBuildTool\IOS\IOSToolChain.cs:line 938
MainFrameActions: Packaging (iOS): UnrealBuildTool: at UnrealBuildTool.UnrealBuildTool.RunUBT(String] Arguments) in c:\UE4\UnrealEngine\Engine\Source\Programs\UnrealBuildTool\System\UnrealBuildTool.cs:line 1172
MainFrameActions: Packaging (iOS): UnrealBuildTool: Cumulative action seconds (4 processors): 0,00 building projects, 11061,25 compiling, 0,00 creating app bundles, 0,00 generating debug info, 96,06 linking, 0,00 other
MainFrameActions: Packaging (iOS): UnrealBuildTool: UBT execution time: 3061,90 seconds
MainFrameActions: Packaging (iOS): CommandUtils.Run: Run: Took 3061,9701347s to run UnrealBuildTool.exe
MainFrameActions: Packaging (iOS): BuildCommand.Execute: ERROR: BUILD FAILED
MainFrameActions: Packaging (iOS): Program.Main: ERROR: AutomationTool terminated with exception:
MainFrameActions: Packaging (iOS): Program.Main: ERROR: Exception in AutomationTool: Command failed (Result:2): C:\UE4\UnrealEngine\Engine\Binaries\DotNET\UnrealBuildTool.exe Idol IOS Development C:\UE4\UnrealEngine\Projects\Idol\Idol.uproject -noxge. See logfile for details: ‘UnrealBuild
MainFrameActions: Packaging (iOS): Tool.1.txt’
MainFrameActions: Packaging (iOS): Stacktrace: at AutomationTool.CommandUtils.RunAndLog(String App, String CommandLine, String Logfile, Int32 MaxSuccessCode, String Input, ERunOptions Options) in c:\UE4\UnrealEngine\Engine\Source\Programs\AutomationTool\ProcessUtils.cs:line 755
MainFrameActions: Packaging (iOS): at AutomationTool.CommandUtils.RunUBT(CommandEnvironment Env, String UBTExecutable, String CommandLine, String LogName) in c:\UE4\UnrealEngine\Engine\Source\Programs\AutomationTool\UBTUtils.cs:line 29
MainFrameActions: Packaging (iOS): at AutomationTool.UE4Build.BuildWithUBT(String ProjectName, String TargetName, UnrealTargetPlatform TargetPlatform, String Config, String UprojectPath, Boolean ForceMonolithic, Boolean ForceNonUnity, Boolean ForceDebugInfo, Boolean ForceFlushMac, Boolean DisableXGE, String InAddArgs, Boolean ForceUnity) in c:\UE4\UnrealEngine\Engine\Source\Programs\AutomationTool\UE4Build.cs:line 321
MainFrameActions: Packaging (iOS): at AutomationTool.UE4Build.Build(BuildAgenda Agenda, Nullable1 InDeleteBuildProducts, Boolean InUpdateVersionFiles, Boolean InForceNoXGE, Boolean InForceNonUnity, Boolean InForceUnity) in c:\UE4\UnrealEngine\Engine\Source\Programs\AutomationTool\UE4Build.cs:line 1258 MainFrameActions: Packaging (iOS): at Project.Build(BuildCommand Command, ProjectParams Params, Int32 WorkingCL) in c:\UE4\UnrealEngine\Engine\Source\Programs\AutomationTool\Scripts\BuildProjectCommand.Automation.cs:line 111 MainFrameActions: Packaging (iOS): at BuildCookRun.DoBuildCookRun(ProjectParams Params) in c:\UE4\UnrealEngine\Engine\Source\Programs\AutomationTool\Scripts\BuildCookRun.Automation.cs:line 235 MainFrameActions: Packaging (iOS): at BuildCommand.Execute() in c:\UE4\UnrealEngine\Engine\Source\Programs\AutomationTool\BuildCommand.cs:line 37 MainFrameActions: Packaging (iOS): at AutomationTool.Automation.Execute(List1 CommandsToExecute, CaselessDictionary`1 Commands) in c:\UE4\UnrealEngine\Engine\Source\Programs\AutomationTool\Automation.cs:line 362
MainFrameActions: Packaging (iOS): at AutomationTool.Automation.Process(String] CommandLine) in c:\UE4\UnrealEngine\Engine\Source\Programs\AutomationTool\Automation.cs:line 330
MainFrameActions: Packaging (iOS): at AutomationTool.Program.MainProc(Object Param) in c:\UE4\UnrealEngine\Engine\Source\Programs\AutomationTool\Program.cs:line 98
MainFrameActions: Packaging (iOS): at AutomationTool.InternalUtils.RunSingleInstance(MainProc Main, Object Param) in c:\UE4\UnrealEngine\Engine\Source\Programs\AutomationTool\Utils.cs:line 610
MainFrameActions: Packaging (iOS): at AutomationTool.Program.Main() in c:\UE4\UnrealEngine\Engine\Source\Programs\AutomationTool\Program.cs:line 50
MainFrameActions: Packaging (iOS): Program.Main: ERROR: Command failed (Result:2): C:\UE4\UnrealEngine\Engine\Binaries\DotNET\UnrealBuildTool.exe Idol IOS Development C:\UE4\UnrealEngine\Projects\Idol\Idol.uproject -noxge. See logfile for details: ‘UnrealBuildTool.1.txt’
MainFrameActions: Packaging (iOS): ProcessManager.KillAll: Trying to kill 0 spawned processes.
MainFrameActions: Packaging (iOS): Program.Main: AutomationTool exiting with ExitCode=1
MainFrameActions: Packaging (iOS): Domain_ProcessExit
MainFrameActions: Packaging (iOS): ProcessManager.KillAll: Trying to kill 0 spawned processes.
MainFrameActions: Packaging (iOS): AutomationToolLauncher exiting with ExitCode=1
MainFrameActions: Packaging (iOS): copying UAT log files…
MainFrameActions: Packaging (iOS): RunUAT.bat ERROR: AutomationTool was unable to run successfully.
MainFrameActions: Packaging (iOS): BUILD FAILED

One thing that I over stepped in this tutor is that I made my project in sub folder (C:\UE4\UnrealEngine*Projects*\Idol) but in the UE4Games.uprojectdirs file I wrote ‘./Projects/’ (without quotes). Is it quite right? Any suggestions why it is failed?

Did you look at the log file (UnrealBuildTool.1.txt)?

No, but I’ve already get it working by moving my project to UnrealEngine directory (from UnrealEngine\Projects) and setting ‘./’ to UE4Games.uprojectdirs. That way it works and producing ipa file. But is there any way to store your project in a folder different from UnrealEngine? It would be pretty handy

Project Settings > Packaging. Click the arrow at the bottom of the “Project” group to see it.

You can try adding a junction/hard link at UnrealEngine\Projects that points to your project folder. You can use the (excellent) Link Shell Extension to make it easy to create and mange hard links.

I’m not sure what you mean by put ./ in it. So the UE4Games.uprojectdirs is a blank file? and I know ./ usually refers to the current location but I have no idea what you are trying to convey.

Also, I have NO IDEA where you see this iOS in the Project Settings. All I can find is PLATFORMS → Android/Windows…

You are using Github source correct? And is it a code project?

UE4Games project isn’t a blank file, all it should have is ‘./’ in it. It tells UE4 basically that all the projects can be found in the UnrealEngine folder. You’ll also want to make sure your project is there.

So I can finally get it to remote build but still have problems with the signing (see below). Updated the plist file Key=CFBundleURLName String=com.ciinc.ciicharm since I think that is what is in the .mobileprovision file.

I opened the .mobileprovision file and found the following:

<key>AppIDName</key>
<string>Cii Charm</string>
<key>ApplicationIdentifierPrefix</key>
<array>
<string>72AG549EXJ</string>
</array>
<key>application-identifier</key>
<string>72AG549EXJ.com.ciinc.ciicharm</string>

So I basically tried both “com.ciinc.ciicharm” and “72AG549EXJ.com.ciinc.ciicharm” but it keeps throwing the same error. Perhaps the files aren’t in the correct location? The error below says CODE_SIGN_RESOURCE_RULES_PATH = /UE4/Builds/GT02/UE4/UnrealEngine/Charm/Binaries/IOS/CustomResourceRules.plist which is the path on the remote MAC machine. Looking in that location there is a CustomResourceRules.plist file but there is no .mobileprovision file in that location. Should it be copied to that location during the process??

Running RPC on 10.2.1.133 …
… making application (codesign, etc…)
Using signing identity ‘iPhone Developer’
… working folder: /UE4/Builds/GT02/UE4/UnrealEngine/Engine/Binaries/IOS/XcodeSupportFiles/…
… /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -project UE4_FromPC.xcodeproj -configuration Development -target ‘Charm - iOS’ -sdk iphoneos CODE_SIGN_RESOURCE_RULES_PATH=/UE4/Builds/GT02/UE4/UnrealEngine/Charm/Binaries/IOS/CustomResourceRules.plist CODE_SIGN_IDENTITY=“iPhone Developer” IPHONEOS_DEPLOYMENT_TARGET=“6.0”
[RPC] Build settings from command line:
[RPC] CODE_SIGN_IDENTITY = iPhone Developer
[RPC] CODE_SIGN_RESOURCE_RULES_PATH = /UE4/Builds/GT02/UE4/UnrealEngine/Charm/Binaries/IOS/CustomResourceRules.plist
[RPC] IPHONEOS_DEPLOYMENT_TARGET = 6.0
[RPC] SDKROOT = iphoneos7.1
[RPC] === BUILD TARGET Charm - iOS OF PROJECT UE4_FromPC WITH CONFIGURATION Development ===
[RPC] Check dependencies
[RPC] Code Sign error: No matching provisioning profiles found: No provisioning profiles matching the bundle identifier “com.ciinc.Charm” were found.
[RPC] CodeSign error: code signing is required for product type ‘Application’ in SDK ‘iOS 7.1’
[RPC] ** BUILD FAILED **
IPP ERROR: Xcode build failed!
[RPC] The following build commands failed:
[RPC] Check dependencies
[RPC] (1 failure)
IPP ERROR: RPCCommand MakeApp failed with return code 65

I’m documenting all of this in hopes to help others. So in the .plist file it had:

<key>CFBundleIdentifier</key>
<string>com.ciinc.${BUNDLE_IDENTIFIER}</string>

BUNDLE_IDENTIFER is the name of your project you gave it. In my case I have it a name “Charm”. I had to manually override the .plist file to:

<key>CFBundleIdentifier</key>
<string>com.ciinc.ciicharm</string>

All is good. Now I’m troubleshooting why it doesn’t seem to find the cert/private key that I imported on my windows machine =( Any ideas??

Found Info.plist (D:\UE4\UnrealEngine\Charm\Saved\StagedBuilds\IOS\Info.plist) in stage, which will be merged in with stub plist contents
Using mobile provision ‘iOS Team Provisioning Profile: com.ciinc.ciicharm’ to code sign
… Writing updated embedded.mobileprovision
IPP ERROR: … Failed to find a certificate that matches the mobile provision to be used for code signing
Found CFBundleVersion string ‘10246.0’ and updated it to ‘10246.9’
Saving IPA …
… Writing updated Info.plist
Opening source executable…
… Initial signature step

Hi Awdogsgo3heaven, I got same problem with you on UE4Game.stub
Did you find the way to fix it?

Pardon for raising this thread from the dead but is this still the best way to remotely build a Windows iOS Code project on a Mac for 4.8?

Edit: and is this doable without downloading and building the full source code?

I have a iPad, I could test it on for you, but 1st I want a tutorial on how to get a apple developer’s certificate so I can create a developer’s license for my game I am working on. :smiley: