iOS Switching from paid to free app, how does one know who previously purchased the app? - ios

I have a paid app that was released on iOS 4. It hasn't been updated and I'm now reworking it to work with iOS 10. Since in app purchasing was not a thing, I made a free (lite) and paid version of the app. I would like to update the paid version to iOS 10 and change it from paid to free with ads and an in app purchase to remove ads.
I tried researching various methods and I have not found a fool proof way or evidence that one will work in all cases. The two most prevelant methods I found:
Use an existing UserDefaults key value to determine if they opened the old app and then grant them no ads in the new version.
I don't think this method will work, as if the app was uninstalled or the user redownloads it after the update they would not have that value.
I believe iOS 7 offered receipt checking. Use receipt checking to determine if the user has paid for the app and check if the date is before the new version date.
I'm not sure if this would work either. I saw in the documentation to verify locally. Would everything I need exist if the app was an iOS 4 app originally? Would this work for users who had the app through a promo code? What if they don't have an internet connection at the time they open the app? I had trouble finding sample code for this option to test.
How would I go about doing this? Are any of the methods above the only way or are there others?

Out of all the resources I found on this subject, checking the receipt seems to be your only feasible choice. If you have an account where you purchased your app, you can run the new version of the app via Xcode with that account and see if the receipt validation gives you the expected information. Though installing the app via Xcode may alter the receipt that the account has, you may want to check on that.
NSUserDefaults option could work if you were setting any value to NSUserDefaults on the iOS 4 version.

Related

How / When is IAP information added to iOS app receipts?

Short Version:
My freemium iOS app sends the app receipt to my server for validation and to check wether a users is eligible for subscription introductory offers. I noticed that there are a lot of receipts with no IAPs inside. This would mean that many users have been using the free trial version for years, which is quite unlikely.
So when is IAP informatioin added to the receipts?
Long Version:
My app has been offered in the iOS App Store for several years using a Freemium Model: User can download the app for free and test it for an unlimited time with limited features. A non-consumable in-app purchase can than be uses to remove these feature limits.
In theory users can use the app indefinitely without any purchase just using the test feature set. However, the due to the limitations this is highly unlikely.
Recently I have updated the app to offer subscription. To check if users are eligible for introductory offers the app receipt is send to my server for validation.
I noticed that there are a lot of receipts with no IAPs inside. Even for receipts with original_app_versions which are several years old. This would mean that many users have been using the free trial version for years, which is quite unlikely (due to the very limited feature set).
So when is IAP informatioin added to the receipts?
The new app version send the receipt to my server on the first start. There are three possible cases:
The app was never used before and this is the first installation of the app ever.
original_app_version == current version
Of course on the first start there are no IAPs, so nothing unusual in this
This an updated of an earlier version which was installed before
original_app_version < current version
The app / App Store hat plenty of time to include possible IAPs in the receipt
An earlier version of the app was used but than uninstalled. Now the current version has been re-installed
original_app_version < current version
Since has just been installed it might be possible that the IAPs are not included in the receipt yet?case.
So, only the 2. and 3. case interesting here. Why should previous non-consumable IAPs be stored in the 2. case since the app has been installed and running for a long time?
On the other hand it quite unlikely that thousands of previous users have now re-installed my app and thus resulted in case 3. Even if this really the case, is there anything the app can do to manually trigger the store to add previous IAPs to the receipts? Or does the user have to restore previous purchases first?
EDIT:
As far as I understand the Appel docs it does not really matter what information is stored in the receipt which can be found on the devices. When I upload this receipt to my server it acts like an token when being send to Apple for validation.
Apple than responds with the latest receipt information available (if the receipt/token was valid) in clear text.
Thus it shouldn't really matter how long the app was installed on the device or wether it was a new install or a re-install: Apple provides the latest information available. Thus if there ever was an IAP it should be included in the returned information. Right?
But this would mean that there are thousands of users which have been using a very, very, very limited trial version over years which seems very, very, very unlikely...
Is there any other explanation?

How do I replace an old expired iOS app with a new app that I built from the ground up?

I have what I believe to be a pretty unique situation and I can't seem to find a solution online. The problem timeline:
4 years ago I paid a developer to build/upload an app to the iOS App Store for me under my own developer account.
Over the years it became outdated and this April it was kicked out of the App Store
I took some online courses this year and rebuilt the app from the ground up.
I would like to post my rebuilt version to the App Store - completely fresh like it's a brand new app (because it basically is)
A couple more things to consider...
I used Swift vs the original Objective-C that the developer used.
I used UserDefaults instead of what appears to be iCloud. (the dev account seems to be littered with permissions for things I don't intend to use - so advice on how to get rid of all of the weird stuff I don't use would be helpful, too)
I also have a different but similar bundle identifier (it replaces "RandomRuby" with "Random-Ruby") that Apple's App ID registration system seems to not like.
The level content and game play are the same - but I have no idea how to figure out what level the previous users were on. (which I'm ok with if it's ethical to make people start over).
It had In-App purchases (they could purchase consumable "Rubies" to use for hints and there was an "Ad Free" upgrade option. The new app doesn't use ads - it just has consumable "Rubies" for monetization). I have no plan to add ads back in - so I imagine a complete reset would be ok here, too? Again - is that ethical?
With all of this context - my question is...
How do I upload a completely-rebuilt-from-scratch app with the exact same name from the exact same company as an expired app through the iOS Developer system? Is this even possible? I'm having a hard time figuring out where to start. I can't even get past creating an App ID.
To update an existing app in your Apple Developer account you only need to use the same BUNDLE ID (e.g. com.apple.keynote) in your Xcode project and a higher version/build number. Everything else is not relevant.
Your previous iOS APP is bounded with the Apple Developer account when it was submitted. And the APP name is unique, just like anyone else may not create another app named 'Facebook'.
So, if the Apple Developer account was not yours, you are in trouble. You need to ask the previous programmer to transfer the APP to you.
If the Apple Developer account was merely expired, and you can prove that the account belongs to you, I guess you can contact Apple Support for help.

iOS Receipt validation failing for long-term users

With our latest release, we converted our app from paid to in-app subscription purchase. We promised our current users that we would grandfather them into the subscription because they already paid for the app. In our code, we look for a valid receipt with an original application version prior to our first subscription version. It all worked great in our tests.
When we released the new app, we started getting feedback from our long-term users that they were being asked to subscribe (they shouldn't even see the subscribe button). As we researched the issue, we noticed that all of these users purchased our app prior to the app being transferred to a new developer in September of 2014.
Recreating this issue is difficult - how do we simulate an app install in 2014? I may be able to login as one of the affected users, which would involve using their Apple credentials. I'm not very comfortable asking users to share their credentials.
Since I haven't been able to recreate it and our code is pretty simple, my best guess as to what is happening is that we aren't receiving a valid receipt for users that purchased prior to the app transfer in 2014.
So, I have a few questions:
Has anyone else experienced this?
If so, how have you resolved it?
How would you troubleshoot it?
FYI - I've filed an issue with Apple (3045378).
In speaking with Apple Developer Technical Support, we discovered a way to pull the NSLog messages off of the devices using the recently released Unified Logging feature. A couple of our users submit their logs, which clearly showed that they were getting valid receipts, but the originally purchased versions of those receipts are 4 and 2.8.
Given that our current version is 1.7.1, these are strange and non-typical numbers. However, the Original Application Version reported from the receipt is actually the CFBundleVersion (or Build), which can be a completely different string than the App Version reported in the App Store.
I assume that the developer prior to the app transfer was using a different build numbering system than the standard ... scheme.
I refined the version check within my code and re-submitted the app. It was released today, and, so far, all are being grandfathered correctly.

Check If User Has Purchased Previous App Version

I am moving my iOS app from paid to free and need to know, after the user has installed the update, whether they have purchased the original app.
This way I can reward the user for their previous purchase.
This wasn't possible (easily) before iOS 7 but now it can be down by downloading and parsing the App Store receipt. This is (frustratingly) a lot harder than it sounds. You might want to consider using an Open Source project like RMStore.
I wrote a blog about my experience.

Implementing Upgrade Feature in iPhone App

I already have an app in the app store which is a paid app. Now, I want to make the app free but put an option for NEW users to upgrade for the price. The old users can continue using all the new features of the app since they have already paid. My problem is that how will I track and distinguish new vs old users.
I think my answer is Receipt Validation in iOS 7 but it looks super complicated to implement. Any recommendations?
UPDATE: WRONG SOLUTION! DON'T DO THIS
One solution that has been floating around on the web is to save the version in NSUserDefaults. While that would work but what happens if the user deletes the app and reinstall it again. NSUserDefaults will be gone and then we are going to force the user to buy the app again or upgrade it again.

Resources