How to tell if app user is upgrading or new purchaser? - ios

I would like to switch my app from paid to free with in app purchase, but I don't want to make my current users pay twice. Is there a way to know if a user is upgrading or new?

You can't tell if a user is a new user or a previous owner of the app. Let's say a previous owner of the app buys a new device and installs the latest (IAP) version; there's nothing to let you know that user is new or existing.
If you want to maintain two separate App IDs you could release two versions of your app: one that does not have IAP but costs money (for your existing customers) and one that's free and has the IAP.

updated
If your IAP product's type is non-consumable, user can not buy it again.

what you could do is an upgrade of your paid version that allows a user to generate a special code that they could use (once! some server connection would be useful to register these codes) in the new "free" app to get an upgrade to the full version.

Related

Need assistance regarding In-App Purchase

Currently my is a paid app, now I am planning to make it free with limited functionality, after in-app purchase user can have full functionality. I want to know the people who have purchased previously can directly restore purchase so they don't have to buy again.
Apple doesn't allow to make this automatically. You must do this in your code. For example check your apps version, like version < x.y.z means that it was paid before, version >= x.y.z means this is a new user which should make the in-app-payment to unlock the full version.
No. There is no way to get such things from Apple. But, you can do one things.
If you're having login feature then you can manage same things from date. So, for old registered need to show all features while new users need to show specific features only.

iOS App Freemium to Paid App

I have Freemium apps in the AppStore. Originally it was Paid but I wanted to see if Freemium versions make any difference in Downloads and Sales. It did make difference - number of downloads increased by 10 times but number of purchases reduced by 2 times. So Freemium modal didn't work for me. I want to change back to Paid.
I do not want to create other versions of the Apps as I have really good reviews on all Apps which I don't want to miss. Can someone please help me if it is possible to convert my Apps to Paid and do not allow people to use full functionality who has already downloaded apps but haven't paid?
I will somehow need to detect they have been using old app and not paid. I can do it by releasing an update that store key in the Keychain but I don't understand hoe would those users be able to pay at all as Apple doesn't charge for the App as it is already downloaded in the past, and they won't be able to use full features as they downloaded freemium app....arghhhhh!!! Not sure if this is even possible but want to hear some of yours thought.
I believe paid upgrades are not possible, you will lose profit and you can't do anything about it unless you are willing to create a new app to replace the old one. The move from paid to fremium is a permanent one, you cannot force existing users to pay after the app is free.
It is possible to move back to Paid, without giving the previous Freemium users the full version.
To do this, you have to:
Know the last version of your app that was Paid
Check the user's purchase receipt (refresh receipt if necessary from Apple)
Know whether the user has made any in-app purchases during the Freemium period (e.g. every time the user upgraded, you added an 'Upgraded' item to their keychain)
Switch to Paid
If you have this information, you go ahead and switch your app back to Paid and:
Check whether they have made any in-app purchases (via e.g. their keychain 'Upgraded' flag). If they have, give them the functionality - easy. If they haven't then go to the next step.
Check the user receipt to see what version/date of the app they first downloaded. If it is during the Paid period, upgrade them to full version. If it is not, and the user has not made an in-app purchase, keep them at Freemium.
Disadvantages
There are 2 disadvantages I can see with this approach:
Any user that downloads the app after Freemium will need access to the Internet for you to confirm their receipt. This means the user might download the full version, then at a later time when they are not connected to the Internet, open the app only to find that they have to Upgrade. Of course once they connect to the Internet and their receipt is validated, they will be upgraded, but in the meantime you might get some bad reviews and angry customers.
Your app will now be a Paid app that has In-App purchases. This may confuse users thinking that if they buy your app, they will have to further upgrade via in-app purchases... and put them off.
Of course the advantage is that your Freemium users will stay freemium :)
I have done this myself, and had no problems with the process.

Not offer update to current iOS App users

I want to decrease a few options I have given out as free in one of my app (Universal iOS app) but I do not want any current users to update and lose those options.
Is there any way I can update my app without offering it to the current users. Only new users get the new app?
No it's not possible.
Update is always available for all users that purchased the app.
You may think about adding in-app for those feature and make those in-app already available for the application already installed. The problem is that if the user deleted the application from the phone and install it again, you have no way to know he purchased a previous version (except if you have user login inside the application).

How to charge for a version update for iOS application

Is it possible to charge for a new version of the iOS application? Is it linked to the major version update for the application?
My application is at present at version 1.8 and the new version is almost a rewrite and I would like it to be a paid update to the next version.
If I bump version to 2.x, will that automatically become a paid update? Else what is the way to accomplish a paid update?
If you want EVERY USER, including your current users to pay for the new version, you will need to submit it as a new application. Current users will download the update for FREE. NEW users, if you change the price tier, will pay for the application. And no, the update will not automatically become a paid update. Updates are free to existing users.
You can however create an in-app purchase to unlock new features. This would ensure that even current users would need to pay for the "updates" as well.

Convert existing iOS paid app to freemium model with in-app purchase

I currently have a paid app in the store. Apple have not allowed a 'lite' version to be submitted as well, so I have no choice but to update the current paid version to a freemium (with in app purchase) model. I have the problem of not loosing functionality for v1 users that have purchased the app the first time round.
Is there any way to determine if an application have been updated from a previously installed version so I can unlock the paid parts of the app?
Two similar questions (from a few months ago):
Transition an existing paid for app to free version with In App Purchase
iPhone + upgrade existing paid application on app store to free application with In App purchase + what about the customers who have already purchased the paid application
There is now an Apple-approved way to do this on both iOS and macOS. The originally downloaded version of the app can be obtained from the receipt using the info key Original Purchased Version. You can then decide whether to unlock features if that version predates the switch to IAP.
For instance, once you have retrieved the receipt info:
NSArray *versionsSoldWithoutIAP = #[#"1.0", #"1.1", #"1.2", #"1.3"];
NSString *originalPurchasedVersion = [receiptInfoDict objectForKey:#"Original Purchased Version"];
for (NSString *version in versionsSoldWithoutIAP) {
if ([version isEqualToString:originalPurchasedVersion]) {
// user paid for the currently installed version
}
}
For more info see the WWDC 13 video Using Receipts to Protect Your Digital Sales. At 5:40 the presenter comments: "I think the most exciting thing that's in the receipt this year, especially for you guys if you have a paid app in the store is that we've included information in the receipt that's going to let you do a transition from being a paid app to being a free app with in-app purchases without leaving behind all the customers that have already paid for your app."
With iOS7, iOS app can verify app store receipt, which contains app download date.
By using this donwload date, you could determine if a customer is previously purchased or not
First, I just want to say I personally think the freemium model is great. It has worked out very well for many developers. People love to download free apps, and will do it on a whim, but pay much more attention to an app before spending $0.99 (Which is due to the effect of free - for more info on that, check out Dan Ariely's book Predictably Irrational)
For more info on freemium, google it - There have been tons of articles written about the success of it.
Ok, back to the actual question:
Theres a couple ways you can handle a situtation like this, although the unfortunate matter here is none of them are fool proof.
The best solution would probably be for your users to have accounts. Without knowing the specifics of your app, I can't say whether or not user accounts are appropiate for your app. User accounts stored on your server have many additional benefits, including user management, and tracking what purchases a user has made. This will allow users who delete the app, and then re-install it, or get a new device, to maintain their purchased content. Furher, whenever you use in-app purchase, you should validate the purchase on your own server (or with Apple), which a server based user manegment system can all do. If your totally in over your head with creating your own user management server, check out Parse. Its dead simple to create an amazing backend server (for basically free)
iCloud Key/Value type of system. I'm not very familiar with how this would work - so I'll move on.
Another, not nearly as fool proof solution (but much quicker/easier to implement) is to use NSUserDefaults. You can store an object when the user makes a purchase, or with the date a user installs your app. Then if you issue an update converting your app to freemium. Then in the new update, check which purchases the user has made or the date they installed it, and react accordingly. For info on how to do that with NSUserDefaults, check out my answer to another question on implementing that: NSUserDefaults and app versions.
But this solution does present the following pitfalls:
If the user deletes your app, the NSUserDefaults are lost forever
If the user didn't install the update setting up the NSUserDefault system, but then installed the update with the new freemium model, the app would treat them as if they hadn't purchased the content.
In summery, this is a difficult question, with not a lot of easy/perfect options.
Anyway,
Hope that helped!
I'm dealing with the same thing and came up with the following idea: Create the freemium version under a new name and app ID. Keep the existing paid app in the app store, but raise the price to something absurd and clearly state in the description that the app is there to maintain support for existing users and that new users should try the freemium version instead.
Existing paid users won't lose support for their existing app and can delete and install any time it without re-purchasing.
You won't have to keep updating the old paid app, either. Just keep it in the app store.
The downside is that existing paid users will not be able to migrate smoothly to the freemium version to get any extra features you add in the future without re-paying for what they already have.
Still trying to decide if this will work for me but it could be a good option for others. Comments appreciated.
I've been thinking about this problem for some time now. I have a substantial amount of customers that paid for my (in App Store terms) high-price niche-App and I'd hate having to tell them to re-purchase as I plan to migrate to an In-App Purchase model.
The idea I came up with (and I'll ask Apple support whether it's legal) is to phase out the current paid App but ship a last update for it that allows "unlocking" the In-App purchases of the new App based on the In-App model. I was thinking about a challenge response scheme:
User has installed paid App on his device
User installs new In-App App and opens it. The new App detects the paid version and offers to unlock the In-App purchases (on this device only of course and as long as the App isn't deleted)
The new App generates a nonce, signs it and calls the old App with it via an URL Scheme
The old App decrypts the nonce, adds +1 one to it and signs it again. Calls back to the new App via URL scheme
The new App validates the nonce and unlocks the features
The scheme can be easily implemented using a pre-shared key. It's of course a weakness on jail-broken devices, but then every App storing In-App receipts has those problems.
You can check the 'original_application_version' of the receipt. All iOS downloaded from the appStore have a receipt even if it is a free app.
TPInAppReceipt is a simple swift library that can help you with this.
import TPInAppReceipt
do {
/// Initialize receipt
let receipt = try InAppReceipt.localReceipt()
let originalAppVersion = receipt.originalAppVersion
let buildSoldWithoutIAP = 22
let originalAppVersionInt = Int(originalAppVersion) ?? 23
if originalAppVersionInt <= buildSoldWithoutIAP {
// unlock all features
UserDefaults.standard.set(true, forKey: "isPaid")
}
} catch {
print(error)
}
Note: The receipt.originalAppVersion returned is the build number as at the time the user first purchased the app from the appSore. Also, the receipt won't be available in the sandbox environment until you purchase or restore an inAppPurchase first.

Resources