Can I prevent users with a too-old OS version from downloading my app? - iphone

I currently have an app in the app store that works for iPhone users running iOS version 3.0 or newer. My next version of the app is going to use ARC, so it will only work for users running iOS version 4.0 or newer.
According to this answer, the users will be able to download the newer version, but it just won't run when they try to run it.
Is there any way to prevent users who can't run the app from even downloading it from the AppStore?

I haven't tested this recently, but in February 2011, and iOS 4.x, I had users who couldn't download my app as there device wasn't running the required version of iOS.
They received a nice explanation message on their device, courtesy of the App Store app, when trying to download the app directly to their device.
I'd be very surprised if this wasn't still the case.
So, set the deployment target in your target build settings, and let the App Store / iTunes take care of who can install it.
That was for new installs, and it be different for updates (rather than new installs) but again I'd be surprised if this wasn't handled by Apple for the sake of a better user experience.
UPDATE
I dug out my old iPhone 3 which reached the end of the road at 4.2.1 and resynced it with iTunes - the latest apps that require 4.3 etc are ignored, and are not overwritten with incompatible versions, as I would expect.
I also tried to update my own app (I'm a developer), requiring 4.3 and above, from the store via the device itself, and got a polite pop-up alert saying the app requires iOS 4.3 and above, again just as I'd expect.
The app was previously compatible with < 4.3, and somewhere along the line I bumped up the minimum iOS version requirement, so it is definitely possible.
So, you should just set your updated app's 'deployment target' version appropriately, and it will only be updated on compatible devices.

No. A new higher minimum Deployment target will prevent a user from installing an app on a device with a lower OS version, but will not prevent them from downloading the app using iTunes on their Mac or PC, even though they can't install the update once downloaded.

Related

Minimum iOS Version 5.0 & The App Store

We're talking about making the minimum iOS version of our consumer facing app 5.0+. We have a few questions, and I was unable to find a great resource for the answers:
For existing users with 4.xx, when the next update is released, will they just not see the update in the App Store? IE, until they update their iOS version to our new minimum version, they will never see the most recent update and will be "stuck" on the previous version?
For new customers with 4.xx, when they search for our app on the App Store, will it show up in search results? If so, what will be displayed when they click Install ?
Thank you for your help. I found lots of information on specifically 3.xx to 4.xx, but wanted to get a more detailed explanation for the scenarios explained above. If there is Apple developer documentation for this, please point me in the right direction.:)
Thanks!
Yes.
If you specify the deployment target for your app as iOS 5.x, your customers running iOS 4.x won't see an update on the app store and will be stuck at the previous versions of your app.
New customers running iOS 4.x will be able to see the app but won't be able to install it. They'll get a system error message that iOS 5 is required to install this app.
Hope that helps.
The App store on the device will filter out apps and updates that are inappropriate for the current iOS device OS version. The user won't see them (or if they see them on some devices, won't be able to download or install them).
However, the iTunes App Store on the customer's Mac or PC will not filter by OS version. iTunes will download apps that the user can't install on their devices running older iOS versions, and, far worse, will put any working app versions in the trash after downloading their useless updates.
The App store does not filter apps based on the operating system of your device. It will show iOS 5 apps even if your device is iOS 4. The update will definitely appear in iTunes. I don't know about whether it shows up in the updates in the app itself.

iOS app unable to be downloaded due to target

I submitted my first app last week (yay) and accidentally left the target as 4.3 which really limits who can download the app. I submitted an update that targeted 3.0, which was approved and is on the app store now. The binaries say 3.0, the requirements say 3.0, yet when I install it on a device without 4.3 it still says "This application requires iOS 4.3. You must update to iOS 4.3 in order to download and use this application."
Whats going on here? Any help would be awesome.
I would suspect that you set the deployment target to 3.0 in your project and still have the 4.3 (or latest) setting in your target, which is more specific than the project's setting and overrides it.
I had the same problem with an app (4.2.1 compatible, previously only 4.3+) that hit the App Store last night and wouldn't install on a 4.2.1 device until this morning. Interestingly though, the new binary was most definitely on the store since it installed on an iOS 5 device and had new features bundled with the new build.
I assume there's some separate versioning server or something that isn't synchronized with the download servers, because it does seem to lag for several hours.

Upgrade iOS application to newer OS?

I am a little curious what happens in the following situation. You have an existing app on the iTunes store (with customers) that uses iOS4, you then release an update to the app that uses a newer iOS.
folks that have upgraded to the "newer iOS" will get the update.
What will happen to those that have not updated, will they still be able to use their old iOS4 version?
Your "deployment target" is what matters. Setting the deployment target allows your app to set it's minimum required OS version. Many developers like to set that as far back as possible, unless your app depends on a features only available in a new iOS version.
Lets say you have an app compiled with the iOS 4 SDK and set 3.0 as the deployment target.
Users with iOS 3 or iOS 4 (and iOS 5) can download your app and use it.
Now you release an update compiled with the iOS 5 SDK and set 4.0 as your deployment target.
Users with iOS 4 or iOS 5 can download or upgrade your app and use it.
Users with iOS 3 that have purchased your app already cannot upgrade, but they can continue to use their existing installed version.
Users with iOS 3 that have not purchased your app yet will now have no way to do so.
Apple will only keep exactly one version of your app on the app store.
Unless they download the newer version, they will of course still be able to use the old one. It's possible however that they download the update unintentionally via iTunes on the desktop. The App Store on the device itself would check if the device's OS version is compatible with the app being downloaded, but iTunes does not, so it would replace the old version in the iTunes library, leading to the app being removed from the device when the user syncs it (because the downloaded version cannot be installed).
So, for existing apps, you should keep your deployment target as low as possible and decide at runtime which additional features of a new OS version you can use. This way, you can keep compatibility with older OS versions, but still provide additional features to those who have upgraded.
Usually (although not always), new OSes are the same as the previous ones but with new features. Older versions of apps often work with the latest OS but don't take advantage of the new features. The only problem users usually have is crash problems but it all depends on which APIs you use in your app.
Additionally, updates are never 'forced' upon a user - they are always optional. When it is a case that the app only works on a version of iOS which is higher than what the user has, then the update will not be offered to the user at all. They will still be able to use the older version that they have installed on their device. Apps have no expiry date.
If you want to retain compatibility for as many iOS versions as possible, you can set your iOS deployment target to the minimum OS you want your app to be compatible on. The SDK version number should not matter, but to support the latest iOS features, you would need the latest iOS SDK.
You will still have to check your APIs compatibility with the version you are targeting as a minimum OS. Look here and search for "API Diffs". Each document lists changes to the API for that iOS version. This will lists new and removed APIs as of that version. For example, UIPrintPaper, which is listed in the iOS 4.1 to 4.2 API diffs document, is a new API to iOS 4.2. So, when running on iOS 4.1 or earlier, the app will crash when calling that API. Using #if __IPHONE_OS_VERSION_MAX_ALLOWED <= __IPHONE_4_1 around your UIPrintPaper snipper will fix that problem.

Raising minimum iOS Deployment Target Version for App Update

Let's say we have an application with a deployment target set to 3.0 and we want to raise the deployment target to 3.2. Normally, the App Store won't let the App be installed on devices with an IOS version less then this, but what about devices which already had the App installed prior to the update? Will they see the update but won't be able to install, will they just not see the update or, heavens forbid, will be able to install and the app just won't start?
I searched everywhere for this, but I can't find anything about raising the minimum OS version for an app update.
Thanks!
From my experience those updates just won't show up as available.
When I upgraded OS on my device from 3.1 to 4.1 about 10 available updates appeared immediately in App store app - so that should be the actual behavior.
In addition to only showing supported updates, the store now offers the "last compatible version". This lets people download an app even if their device doesn't support the most recent version. Unfortunately this means that some people could still download an older version with bugs you have already fixed. There may be a way to disable this, but none of my app updates have introduced new requirements, so I can not test.
It's nearly a safe bet that they won't be allowed to install it. A similar situation is iPad apps or Mac apps which won't display in the App Store on iPhones and iPods.
I say nearly because the updates should not appear to older users on their iOS devices. The risk, however, is when users sync with iTunes, or if they update with another device. The new version of the app is now associated with their account, and will ruin the install on the older device if they try to sync it with iTunes.

iPhone App Run Different iOS

I am getting a fat binary when I go to upload, and I want to make sure that my application can run across 3.0, well even 2.0. Is there a specific way to make sure that this will show when I go to upload. I am not using any specific iOS 4 features, and I only have iOS 4 in my xCode. How can I test different iOS version?
The only way as I could think of is test your app on real old OS version devices. Since Apple prefers its users to upgrade to new OS version as soon as possible, they don't actually provide an official way for developers to test such backward compatibility.
Another relevant questions would be, "can I downgrade my device OS version to an old one, so that I can test my app on them?" I once did a research on SO and other Apple forums, and the result I got was NO, we developers don't have a way to "officially" downgrade our device OS version. Yes there are exceptions, you can try jail-breaking and then downgrading.
For jail-breaking / downgrading your OS version, check this post, A TimeMachine taking my iDevice back to 3.1.2? .
Edited: It's actually pretty easy to make sure that users with old OS versions can downloaded and install your app. All you need to do is set the Deployment Target in Xcode to the lowest OS version you want (iOS 3.0 would be the lowest in Xcode 3.2.5).
However, you need to bear in mind that such Deployment Target only ensures that your app can be downloaded and installed on such old version OS devices. They don't ensure compatibility during runtime. You still need to test your app on real old OS devices to ensure compatibility.
I dont think u need to worry about app version 3.0 below because it is not supported anymore. but how to test on different version, make sure change the iOS deployment target as Thomas refered.
There is no currently supported way to do this.
No current Simulator or Xcode tool will ensure that an app is completely compatible with an OS version older than the SDK used. The 2.0 SDK is not compatible with the current development tools. There is no officially supported way to downgrade a device.
Furthermore, Apple no longer even accepts app submissions that have a deployment target lower than 3.0.
Even most old 1st gen devices, if you can find one on eBay, have been upgraded to iOS 3.1.3. But if you have access to an old device running iOS 3.1.3, you can use that for testing. Many developers keep an old used iPod Touch around for just his purpose.
People with devices running something older than 3.1.3 are not only a really tiny percentage of the installed base, but are very unlikely to be still buying apps for that device. Even large developers with staff and legacy hardware available for this testing rarely waste the time on this market.
Look into Project -> Edit Project Settings -> iOS Deployment Target: 3.13. And then build?
Edit according to comment: You still need to ENSURE your code is within the runtime scope, i.e. do checks like 'respondstoselector' before calling methods in question.