I want my app to download only on iPhone 5 and higher. I don't want it to be possible to download on iPhone 4S or lower. How can I achieve this?
You can't restrict your app by device, but you can target specific hardware features by adding them to your info.plist.
The key you're looking for is called UIRequiredDeviceCapabilities.
Here are the valid keys, taken from this list at Apple's developer website: telephony, wifi, sms, still-camera, auto-focus-camera, front-facing-camera, camera-flash, video-camera, gyroscope, location-services, magnetometer, gamekit, opengles-1, microphone, opengles-2, armv6, armv7, peer-peer, and bluetooth-le.
Some keys will approximate (such as armv6 and armv7) what you want. If you require bluetooth-le, you'll cut out a slew of older devices. The gyroscope was introduced with the iPhone 4. The camera-flash key cuts out iPad and iPod touch models without flash.
Using these keys, think about who you're cutting out, but be sure that you're doing it for the right reasons. Excluding a demographic of your potential user base is risky and puts you at a disadvantage in an already competitive market.
Oh, and I'd strongly caution against using these as a shortcut to optimizing against older devices. Performance is your killer feature. Don't blow it.
*UIRequiredDeviceCapabilities was featured on Apple's iOS developer website in September 2010.
Related
As far as I can tell, there aren't any "performance" criteria that you can specify to exclude specific iOS devices via info.plist.
Is it possible, via info.plist, to allow a universal app to run on iPad1, but not on iPhone 3GS/3G? Right now I use the gyroscope requirement (which my app does make use of), as a crutch to support only iPhone 4+ and iPad 2+.
To be absolutely clear, I want to make the app AVAILABLE FOR DOWNLOAD in the App Store on iPad1, but not on iPhone 3GS. This question is not about runtime query of the device from code.
Is my best/only option to create multiple binaries, and remove the gyroscope build from the iPad build (typically called the "HD" build) but leave it there for iPhone/iPod touch?
Look at this question:
Determine device (iPhone, iPod Touch) with iPhone SDK
It goes over determination of different iOS devices. So, you can explicitly support (or not support) some specific model.
Requiring armv7 will drop out everything <3gs, but still includes ipad1. That's the closest I see.
The short answer seems to be "no".
On the up-side, iPad1 only has 256Mb memory, so you need to make your app fit in 256Mb anyway, so it should work on the 3GS. The difference in CPU speed is significant though.
I'm want to target the iPhone 4, iPhone 4S, iPod Touch (4th generation). I do not want to target the iPhone 3G and iPhone 3GS. I've seen some post that said this is not possible. However, I notice in the App Store that some apps do this such as the picture below.
How would I accomplish this?
Those requirements show up because the developers have put armv7 as an entry in the UIRequiredDeviceCapabilities Info.plist key. There's no key specifically to target the iPhone 4 and up, although you can probably eliminate the 3GS using one of the other keys.
Why are you trying to stop people from installing your app on older devices?
I believe you want to set UIRequiredDeviceCapabilities to specify exactly which features your app needs. For example, the camera-flash key is only going to be true for iPhone4 and later, if that's what you need.
There's also a Q&A article on it.
In addition to setting the features the device needs with UIRequiredDeviceCapabilities, you can also specify the minimum iOS version that needs to be installed.
See this Apple Technical Note, TN2250.
My iPhone game makes heavy use of the OpenGL ES 2.0 API, and it uses only this version (it needs the shaders). Is it possible to make it only available for the iPhone 3GS+? Not allowing customers of previous versions to download it?
EDIT: I heard that the Infinity Blade runs only on iPhone4, how did they do that? Are there other games in the appstore that require OpenGL ES 2.0 and no other? If there is such a thing, how do I do that?
you can make your app on app store only visible to certain models with UIRequiredDeviceCapabilities.
check out the article.
thanks.
To expand upon mohacs' answer, if you only want to make the application available to certain classes of devices, you can set various keys within the UIRequiredDeviceCapabilities item in your Info.plist. The definitive listing of which capabilities filter for which devices can be found in Apple's iTunes Connect Developer Guide under the "Device Compatibility Matrix" section.
If you rely on OpenGL ES 2.0 support to be present for your application to run on a device, you'll want to have opengles-2 appear in your UIRequiredDeviceCapabilities. The iPhone 3G S was the first iOS device to support OpenGL ES 2.0, so this will filter out the original iPhone, iPhone 3G, and 1st and 2nd generation iPod touches. There are plenty of applications out there that require this, and with people like Marco Arment reporting that fewer than 3% of the iOS devices in the wild lack support for OpenGL ES 2.0, it's a safe filter to use.
You make mention of only supporting the iPhone 4 and up. That's a little trickier to filter out, because while you could use the gyroscope or front-facing-camera keys to target newer A4 or A5 processor devices, this will not include the original iPad, which had hardware slightly more powerful than the iPhone 4.
My recommendation is to target the iPhone 3G S and up, because the iPhone 4 isn't that much more powerful than the 3G S. Also, the iPhone 4's Retina display can mean that fill-rate-limited OpenGL ES applications could run a lot slower on in than the 3G S, due to the difference in the number of pixels you need to render.
I'm not sure that it is possible, but you can add a check on iOS version. If it's 5.0 or higher let the app run, otherwise give a feedback saying that this app requires iOS 5.0 or higher. AFAIK iOS 5.0 can only be installed on iPhone 3GS+
Hope it helps
We are building an app that requires the RAM, GPU, and cores of an iPad 2 or iPhone 4S. Is there any way to configure the app so that it is not available in the app store to users of lesser hardware?
I know that I can build armv7 only, and that eliminates the really old stuff. It looks like I could require a still camera (even though we don't use it), to eliminate the iPad 1 (although that feels like a hack). But that doesn't keep it off iPhone 4 or Touch 4.
Any suggestions?
Unfortunately, there is no UIRequiredDeviceCapabilities string that only filters for devices with the A5 processor.
The closest you get, looking at the "Device Compatibility Matrix" in the new iTunes Connect Developer Guide, is the new bluetooth-le key that filters for just the iPhone 4S based on its support for Bluetooth 4.0 Low Power communication. The iPad 2 doesn't have this hardware (although it's safe to bet the next generation will), so it doesn't satisfy this required capability.
I'm a little surprised by this, because there are new OpenGL ES extensions which are only available on the iPad 2 and iPhone 4S, and I could see building applications that require those capabilities. I'm not sure how you'd specify that, so I filed an enhancement request (rdar://10356232) for a key like this.
This is now possible with the release of iOS 6. By requiring iOS 6, you can effectively require that only iPhone 4+ and iPad 2+ are supported.
My iphone app doesn't run well on the iPhone 3G. Can I make it so users with these models can't download the app? If so, what does a 3G user see when they search for my app in the app store?
Does it appear in the store at all for them? If it does, when are they notified that they can't download the app?
I recommend you use the UIRequiredDeviceCapabilities key in your info.plist. This lets you tell the App Store exactly which capabilities you require instead of which device you require.
If your app "doesn't run well" on a 3G I'll guess it is because of performance and therefore you'd want to require a newer processor. Look into setting arm7 as one of your required device capabilities.
For more info look here:
http://developer.apple.com/iphone/library/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW3
Make it run better. Or if it's not completely unusable, just let them use it anyway. People with old devices expect them to be a bit slow.
According to the iTunes Connect Developer Guide (which links to the iOS Application Programming Guide), you can't prohibit certain devices. You can, however, require certain features which are only present on new devices:
armv7 is what I'd recommend (older devices are armv6)
magnetometer, because older devices don't have one. Apple might look at you funny if your app doesn't actually use the compass though.
opengles-2, because older devices only support 1.1. Apple might look at you funny too.
auto-focus-camera, except the iPad and all the iPod Touches don't have one. Probably not what you want.
iPhone 3GS uses iOS 6.1.x so if your app support iOS 7+ it will not be able to install on iPhone 3GS, this is the best possible way to avoid download on that device.