Can I restrict my iPhone app from being used by iPhone3G's? - iphone

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.

Related

Change compatibility of submitted app from universal to iPhone only

My app that I submitted yesterday to the App Store had to be compatible only for iPhones because that is how I already set it to like this.
Now I saw that on iTunes on my app it says that is compatible with iPhone, iPad and iPod and it really should be only iPhone.
I tried to solve the problem with adding the element telephony to the array Required device capabilities in info.plist like this.
Will that make in iTunes to say Compatible with iPhone only and not allow installs on iPads and iPods ? If not how can I solve the problem ?
Yes, that should do it according to this other stack overflow post:
How to Restrict the iOS app only for iPhone excluding iPad?
Essentially there's no way to restrict apps by device unless the device doesn't have a feature you need, in this case, the ability to make calls (telephony).

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.

iPhone application compatibility

Please how can I make sure before developing my iPhone app that it will be compatible with iPhone4, 3GS, iPod touch and 3G?
You need to create the app keeping in mind all the features available in lowest version of iPhone you need it to be compatible to.
For Example:
Suppose you want it to be compatible to iPhone 2G then you cannot use in-app SMS feature as iPhone 2G cannot be upgraded to iOS 4.0 or higher.
In-app SMS feature is only available in iOS 4.0 and higher versions.
Hope this example gave you a proper idea.
Once the app is made, you should test your app throughly on different devices i.e. iPhone 3G, iPhone 3GS and iPhone 4 and iPod Touch.
Unless you test it on device, you cannot be sure because sometimes some of the things work in simulator but crashes on device.
So better to test on device.
Hope this helps you.
If it's the SDK you are talking about, you might want to make sure it runs on iOS 3.X versions. See here for more details.
If it's the hardware you are talking about, you will need to test your app on separate pieces of hardware to make sure that they all run.
The settings in XCode that you make regarding which version of iOS your app will be compatible with is the iOS deployment target and the Base SDK. The Base SDK is the default version you are building against (this should be set to the most recent SDK which is currently 4.3). The iOS deployment target is the earliest version you would like your app to be available for (currently goes back to 3.0 on XCode 4).
These settings are in the settings for your target.
As for if your app will actually work on all of these devices depends on how you program for them. In other words, if you are using new APIs, they obviously will not work on versions that did not implement them.
Hope this helps.
Jamie
You can't be sure without testing. (and even with testing, some say...)
There are potential "gothcha's" in the iOS API documentation, in the Simulator handling of those APIs, and particularly in device performance, which you may not realize or be able to guess until you actually try an app out on all the device models and iOS versions which you plan to support.
Even some simple apps with no undocumented API use and no compiler or analyzer warnings, et.al., have been know to "break" after a new OS version is released.
You can "claim" an app is compatible by appropriate setting of the Deployment Target in the Build settings, lack of plist hardware restrictions, and in the app store submission data. But that's only a claim, not compatibility.

Can a restrict my app to iPhone 3GS/iPhone 4?

I have an app which runs excellently on an iPhone 4, and comfortably on a 3GS. Is it possible to target only the 3GS/4 and not the 3G? The 3G just freaks out when I run it, all sorts of graphical glitches, crashing, low fps etc, I don't even want 3G users to see the app on the store. I can't really 'tone down' the app to use less memory/power for the 3G, it would remove the main purpose of the app.
The only way I have come up with is to adding multitasking as a requirement for the app in the info.plist, but this seems a little hacky.
Also, is this likely to get me in trouble as far as submission goes?
Add "armv7" to the required device capabilities of your app's info.plist. Only the 3GS and newer use that CPU architecture. An app requiring armv7 won't even install on a 3G and other older armv6 devices.
Looks like this has been addressed previously, you can determine the version and perform an appropriate action based on that.
Link to thread

Prevent iPhone app to run on iPad

I'm shipping two binaries; one for iPhone/iTouch and the other for iPad. It's the same application.
Will Apple ensure that the user will never receive an iPhone version of the app on the iPad? If YES, then I don't have anything to worry about, but if not then I do have a problem.
The reason I ask is the iPhone application will simply not work correctly on the iPad because the server knows it's an iPad and will deliver the iPad HD content to it and the iPhone cannot handle that. I would rather not hack my application to send the server a fake device type if running the iPhone app on the iPad in order to receive the correct resources.
Suggestions?
I've been looking for this for a while because I couldn't prevent the iPhone app to load on the iPad. Searched a bit to understand why this was happening, followed #hotpaw2 instructions and found this on the official apple store rules:
UPDATE:
2.4.1 To ensure people get the most out of your app, iPhone apps should run on iPad whenever possible. We encourage you to consider
building universal apps so customers can use them on all of their
devices. Learn more about Universal apps.
https://developer.apple.com/app-store/review/guidelines/
The SDK and/or App store rules prohibit you from preventing an iPhone app from running on an iPad in 1X or 2X zoom mode, unless there are other requirements listed in the app plist. Apple's app review is known to test iPhone-only app submissions (unless there are other requirements) on an iPad, and reject the app if it doesn't run properly.
Other requirements (as listed under UIRequiredDeviceCapabilities in the app's plist) might include your app requiring telephone capabilities (or healthkit, etc.), which might help you temporarily, but still won't prevent the app from running on some hypothetical future iPad product that includes telephony capabilities (and/or healthkit, etc.).
Actually you can.
Add telephony to UIRequiredDeviceCapabilities in your plist file.
But i really not recommend it and maybe you could get rejected because of gratuitously using this property.
I think you should handle that there are iPad versions and iPhone versions on iPads, use the second one as an iPhone.
Also don't forget that retina iPads will use upscaled applications at retina resolution while none retina ones use the standard resolution. And this behavior can tweaked using jailbreak tweaks like RetinaPad and FullForce.
In the plist settings, add Application requires iPhone environment and set the boolean to YES