AppStore: blocking the game for 3G- devices - iphone

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

Related

Allowing univeral iOS build to run on iPad1 but not iPod touch 3G

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.

Is it possible to restrict an application to only run on iPhone 4 and higher?

I have an iPad game and I'm attempting to port it to the iPhone, but it is very graphically heavy and I would rather not have to make an iPhone 4 and a non-Retina (iPhone 3GS, etc.) version for the game.
Is it possible to restrict the download to just the iPhone 4 users? If not does anyone have another suggestion for this?
Take a look at UIRequiredDeviceCapabilities. To limit to just the iPhone 4 and 4S you could ask for the front-facing-camera capability. But have a look through the capabilities as another might suit you better. Maybe opengles-2 capability if your game is using OpenGL then that might be the exact one you want?

difference between developing for iphone 3gs and for iphone 4

I've developed application for the original iPhone, the 3G and the 3GS, now I need to develop an application for the iPhone 4. What is the difference between developing an application for iPhone 3GS and the iPhone 4?
The most noticeable change is the Retina Display and you should include #2x images in your project to support this. Other than that unless you plan on taking advantage of new hardware (gyroscope for example) or the graphics and cpu improvements, there is very little difference. Also you should reference the SDK Compatibility Guide for tips on maintaining backwards compatibility and/or supporting features available only on certain devices.
The iPhone 3GS uses a 480-by-320-pixel resolution screen where as the iPhone 4 (and 4S) uses a 960-by-640-pixel resolution screen.
As #Joe says, there is very little other differences.

How to Require iPad 2 or iPhone 4S in App Store

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.

Is iOS 4 generally backwards compatible?

I have the following problem, in near future I will need to write a few not very complicated apps for iPhone. I do not currently own an iPhone, so I plan to purchase one for testing purposes. In short would iPhone 4 allow me to test apps written for older ios versions? Any pitfalls? Or would I have to purchase older phones/ipad to do the testing properly?
Yes, to perform a proper test you will need to test on the individual devices you are supporting. The documentation will tell you if the framework/API you are using is supported in the older iOS versions. I'm afraid there will be some subjective answers here as I am sure some apps end up running just fine across many versions with simulator testing. There are many factors to consider when looking at backwards compatibility (desired speed, memory usage, APIs, ...). You stated your app is "not very complicated" so you may be fine. I would test your application on as many devices as possible.
I should also make the distinction that there is a difference between "will it compile" and "does it perform as expected". You can use xcode to test whether the application is compatible by targeting and older version. Whether or not the application runs as desired will be discovered when testing on the specific devices.
You can't run iOS 3 on iPhone 4, so you have to buy separate devices.
But if it is a new app I wouldn't consider to make it iOS3 compatible. Most users have upgraded to iOS4 already. And at the time your app is in the store there will be even less users running iOS3.
Sure, this will remove like 0,5% of potential customers. But you don't want to buy another device for 100$ if you can get only 10$ revenue from the 0,5% customers that run iOS3. And you have to test your whole app again, which will take a significant amount of time.
So you should consider to drop support for iOS3.
See this question: Will an application compiled for iOS 3 run on iOS 4?
It will allow you to test apps which are targeted at older iOS versions, yes.
Performance differences to older iDevices like the 1st gen iPhone / iPod touch are quite significant however. So if your apps require expensive calculations or the like, I'd recommend buying an older, used device too to get a feeling for performance on that generation of hardware.
Note that if you need to make sure the apps you are about to develop will run on very old devices / iOS versions, you maybe need to do without some cocoa classes and methods which require more recent versions of iOS
If you bought an iPhone 4 for testing purpose.. You're testing on the latest iPhone available in the market and that doesn't means your app is ready to target low-end device automatically.
Let's take a deep look: If you've designed an App that must look gorgeous and work right out of the box on iPhone 4, then you're probably making your app a Retina display compatible. That is like playing with 960x640 resolution screen.
Now, if you planned to target low-end device for eg, iPhone 3GS, then all you gotta do is to reduce the graphic assets size by half, as iPhone 3GS is 320x480
That's it! Your App is ready for the low-end device as well, in looks and feels perspective.
Now, let's look from deployment perspective. If you base SDK is 4.2.1 and you're targeting to devices which runs 3.3, then all you gotta do is to make sure you don't use latest libraries/classes which are introduced in iOS 4.2.1, as they won't be available to device which are running on iOS 3.3. If you take care of this part, your app is almost ready to ship out.
From Market perspective. I see all the great apps out there had made their deployment target as iOS 4.0 or later. That means, they are targeting to only devices which runs iOS 4.0 or later versions.
I think, you can try your build in low-end iPhone simulator after successful testing cycles ran on iPhone 4 device. :)
The iPhone is generally not backwards compatible. Sometimes methods, properties, classes etc. are added or older ones become deprecated.
For testing, i would recommend that you have several devices with different iOS Versions depending on the target iOS Version you want to release.
Also check the the iOS Reference Library: Under "Availability" for each function etc. is noted since when it is Available