iOS 11 has been released and 32 bit app support has officially been dropped. Do you need to update your ShiVa-powered games on the AppStore? Are games built for iOS 11 apps backwards compatible? Let’s find out.
iOS 11 and 32bit
A few days ago, Apple held their annual Fall event where they introduced the new iPhone lineup, running the latest iteration of the Apple mobile operating system, iOS 11. Apart from the usual facelift, usability enhancements and new technologies, this release marks another important milestone: the end of 32bit in the Apple eco system. 64bit has been the default on the Mac for over a decade now, but there has always been backwards compatibility with 32bit desktop programs. However, starting with iOS 11, 32bit apps will no longer run at all on i-devices. There has been quite a bit of confusion about this decision in the international development community. What does Apple’s move mean to the ShiVa community?
Updating to iOS 11
iOS 11 will not run on all Apple mobile devices. To update to iOS 11, users must have compatible 64bit SOCs. Compatible devices with 64bit chips ready for updates are: iPhone 5s/SE/6(s)/7 (Plus), iPad 5gen/Air/Air2, iPad Mini 2/3/4, and iPod Touch 6gen.
So right from the start, not all users will be able to upgrade, only those who purchased their devices fairly recently. As expected, users cannot downgrade to iOS 10 once they updated to 11. Going back and forth for testing purposes is not possible. This creates the unfortunate need for developers to own essentially two devices for testing, one with iOS 9/10 where you ignore all the update notifications, and one with the current iOS 11+, assuming you want to test both 32bit and 64bit builds. Owning a device with a 32bit SOC on the other hand is not necessary, as iOS 10 is perfectly happy to run 32bit apps on a 64bit chip.
Getting your old apps ready
Since February 1st 2015, all apps submitted to the App Store needed to be built with the iOS 8+ software development kit and include 64-bit support. ShiVa added support for 64bit iOS apps later in February, and we supported iOS universal apps (32bit and 64bit engine binaries in one app package) as the default build option ever since then. In other words, if you built and submitted your app to the Apple iOS App Store later than around March 2015, chances are good that you are already set for the future and don’t have to change a thing. If your app is older than that, especially if your app was initially built with the legacy toolchain ShiVa 1.9.2/UAT 1.4, you will need to update your builds.
Fortunately, updating your build with ShiVa and the latest Xcode is very easy. All you need is a recent version of ShiVa 2.0 beta (8, DR or SVN), a Mac with macOS 10.12.6 or 10.13, Xcode 9 and the iOS SDK. For testing and distribution, you will need to have your provisioning profiles up to date, as well as iOS test devices to push your builds to.
As we have seen, not all users will be able to upgrade due to their 32bit SOCs in their slightly older devices. So compiling for iOS 11 and 64bit only will shut out a large number of customers from using your game. A good compromise is building with the latest Apple toolchain (Xcode 9/iOS 11 SDK), but targeting a lower iOS version. ShiVa defaults to iOS 8, which is a good idea because iOS 8 marks the cutoff point for Apple’s universal app requirement from February 2015.
Creating a Build
Let’s go through an entire build from start to finish. You should already be familiar with the ShiVa 2.0 export options for iOS, and little has changed for iOS 11. As always, we recommend doing Xcode Project builds instead of direct APP builds:
Choosing a provisioning profile is required, but picking the “right” one does not matter nearly as much in Xcode 9, as we will see shortly:
When Xcode loads your project, it will have a number of project update suggestions for you, signified by a small exclamation mark near the project name. These changes are of no real consequence to your build and can be usually be blindly accepted:
Signing has become a lot easier. In the “General” tab, there is a checkbox that reads “Automatically manage signing” which has worked flawlessly for us:
Choosing your deployment target has become very important. As mentioned before, ShiVa defaults to iOS 8 now, but it is possible to change the deployment target:
You can check the result this will have by analyzing the compiled binaries. You can find inside the app package after a build:
For instance, this is what “file” gives you for an iOS 8 deployment target. The binary includes both 32bit and 64bit code:
If you build for iOS 11 instead, the game will only include 64bit code and will therefor not run on older devices:
Don’t forget that plugins must be compiled for each architecture they are supposed to run on. It is possible to compile plugins as universal binaries just like apps themselves, however 32bit-only plugins will not run with universal apps in 64bit mode and vice versa. If you include 3rd party plugins in your game, make sure they support all architectures you need. If you have access to the source code, you should think about recompiling.