Building iOS game in Unreal Engine 4 via remote machine

In Unreal Engine 4 to build a source code for the iOS the Mac computer with installed Xcode is needed. If you are working for other platforms too, having two machines with separate projects might be troublesome. Or maybe you cannot afford buying a Mac for every working station? You can start a building process on the PC with Windows which will send the source code to the Mac computer, compile the code there, get the results and finish cooking and packaging the ipa on PC. How to do this? Here are the instructions!

Setting up remote build machine

The iOS can be built only on iMac machines. We can do it remotely, but the physical machine is required.

Basics

Make sure the user name is setup and it’s password protected (withoud password the ssh remote control won’t be possible). The user name can’t have spaces and special characters!
In Settings enable the Remote Login and Remote Management.

Certificates

First of all, to make certificate valid, you must download the Apple Worldwide Developer Relations Certification Authority certification and import it to the Keychain (it MUST be added by import!).

Make sure that the certificate has been installed to a default Keychain and that there is a default
Keychain at all!

After that install your development certificate to the Keychain too.

Make sure the imported certificate has "This certificate is valid" status.

Then double click on the key paired with your certificate, select "Get Info" option and make sure the "Allow all applications to access this item" is selected.

RSync

Unreal Engine uses RSync for syncing files with remote machine.

Make sure you are an administrator on your Mac. You may need to use sudo to create some of the files below.

Download rsync.plist and copy it to: /Library/LaunchDaemons/rsync.plist

Make sure the permissions of the file are rw-r–r–

You can check if launchd is loading the module correctly by running:
sudo launchctl load `/Library/LaunchDaemons/rsync.plist`
Create a new file: /etc/rsyncd.conf
[root]
path = /
hosts allow = 192.168.0.0/24, 192.168.1.0/24, 192.168.2.0/24
uid = root
gid = wheel
read only = false
comment = Root volume
Hosts are the ip addresses that can use this machine as the build machine. In this scenario, they are all machines with ip: 192.168.0.x, 192.168.1.x and 192.168.2.x (they are all local network addresses).

Make sure the permissions of the file are rw-r–r–

Restart machine.

Setting up Windows

Setting up DeltaCopy

To use RSync on Windows you must install the DeltaCopy to the C:\DeltaCopy\ directory Run the DeltaC.exe and setup it. The name of the profile must be the same as the name of the user name on Mac.


Preparing the project for building on remote machine

Make sure that this option in DefaultEngine.ini is set
[/Script/IOSRuntimeSettings.IOSRuntimeSettings]
bUseRSync=True
[/Script/IOSRuntimeSettings.IOSRuntimeSettings]
bUseRSync=True
Then in the Editor in Project Settings – iOS fill the Remote Build Options section.

Fill the correct ip address of the remote builder, the path to the DeltaCopy and the user name the same as specified in the DeltaCopy.


Press Generate SSH key.

If it will ask if You are sure to connect, type yes!


Then process with the instructions from the console. Left the phassphrase empty!

If for some reason You have an error like this, it means that the key couldn’t be copied.


You can still do this manually. Simply copy the
~/.ssh/RemoteToolChainPrivate.key
from Mac to
c:\Users\User\AppData\Roaming\Unreal Engine\UnrealBuildTool\SSHKeys\[ip_address]\[username]\RemoteToolChainPrivate.key
for example:
c:\Users\User\AppData\Roaming\Unreal Engine\UnrealBuildTool\SSHKeys\192.168.0.178\user\RemoteToolChainPrivate.key

Setting up provisioning and certificate

In the Editor in Project Settings – iOS fill the Bundle Information section.


Run the: Engine\Binaries\DotNET\IOS\IPhonePackager.exe
In this application select the uproject file of your game, then import provisioning and certificate. Then click Ready for Package.


You can check if provisioning and certificate has been properly imported in Project Settings – iOS section (Mobile Provision category)
If there are any problems with provisioning you can try to remove currently imported ones. They are located in following directory:
c:\Users\user\AppData\Local\Apple Computer\MobileDevice\Provisioning Profiles

Building for iOS

With all those steps done the Engine and the Game is ready to build for iOS. Simply set Development iOS target in the Visual Studio and Build the Game. Or, you can build it via Unreal Frontend too.

Possible issues

Q: When receiving an error:
UnrealBuildTool: IPP ERROR: RPCCommand MakeApp failed with return code Error_RemoteCertificatesNotFound
A: Make sure you have proper provisioning and the certificate is installed on the build machine. Also check logs over this line for more detailed informations.



Q: When deploying to iOS it fails at 40% with the message:
There is a problem with the entitlements for this application (0xE8008016).
A: Make sure the provisioning profile supports the device you are trying to install to.



Q: When receiving an error like:
Failed to run init commands on 192.168.0.178. Output = /cygdrive/c/Users/User/.ssh/config: line 2: Bad configuration option: KexAlgorithms
/cygdrive/c/Users/User/.ssh/config: terminating, 1 bad configuration options
A: Check the C:/%UserProfile%/.ssh/config for any lines that starts with KexAlgorithms and remove it.


Q: When deploying to iOS there is an error:
DeploymentServer: Install \ Update of "MyGame.ipa" failed with Missing Bundle Identifier Error
A: Check if your ipa file has the correct bundle id in Info.plist



Q: When building there is an error like:
UnrealBuildTool: IPP ERROR: Failed to copy file to C:\MyGame\Intermediate\IOS-Deploy\MyGame\Development\..\XcodeSupportFiles\MyComputer_UE4Temp.mobileprovision and there are no more retries!
A: You probably abort the IPhonePackager tool in the middle of the previous build. Try to run it once again.



Q: When building there is an error that looks like:
1 [main] rsync 8772 child_copy: linked dll data write copy failed, 0x6F8000..0x6F8008, done 0, windows pid 8772, Win32 error 998
A: According to this page there might be a dll override in Cygwin. Try to restart Windows.



Q: While building there is an error like this:
UnrealBuildTool: ERROR: System.FormatException: Input string was not in a correct format.
UnrealBuildTool:   w System.Number.ParseSingle(String value, NumberStyles options, NumberFormatInfo numfmt)
A1: Make sure the Xcode is installed and placed in the Application directory on Mac.
A2: Also if there was a message like: Host key verification failed make sure you have the id_rsa of the remote machine in the known_host file on your local machine.
A3: Also it can be caused by the “tt” entry in Cygwin registry key in
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
on local machine. The best option is to remove Cygwin registry at all. It will require restart of the computer.


Q: When building there is an error that looks like:
UnrealBuildTool: ERROR: System.IO.IOException: File exists.
UnrealBuildTool:
UnrealBuildTool:        at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
UnrealBuildTool:        at System.IO.Path.InternalGetTempFileName(Boolean checkHost)
UnrealBuildTool:        at UnrealBuildTool.RemoteToolChain.PreBuildSync()
A: The Temp directory on Windows is full. Clean up the Temp directory.