iOS as Android Dev: Sideloading an App. APK vs. IPA

Jan 31, 2022

In my day job, I mainly work on Android. Recently I got some insights into iOS development. What I found especially interesting is how you install the app on a physical device. On Android, there is this .apk file. You can just transfer your app.apk onto your Android Device (with whatever means possible). Then you only have to make sure that you allow “Installing unknown Apps” for your file explorer app. You can now install an app by just opening the .apk file. This works on any device, no jailbreak, rooting, or other hacks are required.

Not so on iOS. The basic principle is the same: .ipa files are bundled apps that you can install on an iOS device. However, there’s a twist: .ipa files can only be installed on certain devices. Each iOS device has a unique identifier called “UDID”. .ipa files contain a “Provisioning Profile”. That “Provisioning Profile” contains all the “UDIDs” (device IDs) that can install the app. If the iOS device’s “UDID” is not in the “Provisioning Profile”, you cannot install the app. “Provisioning Profiles” not only contain device’s “UDIDs” but also certificates the app is signed with.

To create a “Provisioning Profile”, you need an Apple ID. All devices you want to test your app on must be added on https://developer.apple.com/account/resources/devices/list. You also need a certificate signed by Apple on https://developer.apple.com/account/resources/certificates/list. Only then you’re able to create a “Provisioning Profile” that contains your certificate and your device “UDIDs”. If you have everything created, You can select your “Provisioning Profile” in XCode to build the .ipa. Select your app in XCode’s Project navigator and select the “Signing & Capabilities” tab.

XCode can also automatically add devices you connect to your Computer to a “Provisioning Profile”. However, I didn’t try that yet.

But Why?

Why do we have to jump through all these hoops just to get a custom app installed on an iPhone or iPod? On Android, it is so simple. I think Apple wants to make sure that apps can only be installed from their official App Store. Presumably because of both security and financial reasons. Limiting app installation only to some preregistered devices makes it impractical to distribute the app other than via the official App Store. Additionally, I didn’t mention yet that the Developer certificates expire after 1 year, and you can only register up to 100 devices (and maximum 100 distinct devices in a year). So even if you just want to distribute the app to some friends, you’d have to update it every year.

Conclusion

It took me a while to understand how sideloading works on iOS. It’s very different from how it works on Android. I hope this little post helped you to understand “Provisioning Profile” a little bit better.

You might also like