Removing autorenewable subscriptions from iPhone App - iphone

I have an iPhone app that also features autorenewable products as an in-app purchase. The products are subscriptions to our service for up to 1 year in the future. We wanted to remove the whole in-app-purchase and autorenewable product from our app in the next version.
To accomplish this, we removed the signup option inside our app, so no new user should be able to sign up. Now we would like to disable the automatic renewal for all existing users.
How can I accomplish this? Is it sufficient to remove the in-app-products for our app inside iTunes Connect? Do the users get notified about this?

According to Apple (see WWDC 2011 Session 510, In App Purchases for iOS and OS X, at the 48:55 mark), the only things you can do as a developer to prevent subscriptions from auto-renewing are:
Raise the price.
Remove the auto-renewing IAP product from iTunes connect.
In both cases, notification emails are sent to subscribers, though not immediately. The talk says Apple checks 10 days before a (yearly) subscription renewal and sends email at that time. It's not documented anywhere, though, so I'd treat that as an implementation detail.
I've done the latter (removing the product) several times with my own (monthly) apps, and it seems to work as advertised.
One important note: if your app is a Newsstand app, it must have at least one auto-renewing subscription available. If you remove the last one, the app will be removed form the App Store. Users who have already purchased it will still be able to use it, and will be able to download copies from the "previously purchased" section of the app store, but no new copies will show up for purchase in the App Store proper.

It will depend on how you've implemented your system. Do you check receipts (and provide data/service) from your own server, or do it all within the app directly with Apple's servers?
In iTunes Connect you can remove a product from sale, effective immediately or at a future date. I suspect that's enough to stop a renewing subscription. (Remember you can test this with shortened timescales in the Sandbox.) But if not:
If you use your own server to validate receipts, go and give it an incorrect shared secret so that the verification step fails. That means the subscription validity will return as false (although for the 'wrong' reason) so your customers won't be able to renew.
If you do it within the app, generate a new shared secret so the one within your existing structures is incorrect. Then, as above.
If you can, I suggest sending a notification to your current users notifying them of the change, suggesting that they change, and letting them know it will 'fail' in the future but that's ok.

Related

How to restore purchase within in-app purchases?

I have implemented In-app purchase functionality in my iPhone app. In that I have given Restore Option. Sometimes, when I tapped restore button, I am not getting any product ids from App Store. But I have done purchases using Apple ids (Test User Account).
But sometime it works with some-other Apple Ids (Test User account). Why is this behaving differently?
How long should I wait to restore the purchase once after purchase is done. I use to check it on after 10min. Is that OK?
Apple (and Google) does give the option to 'save' the purchase history for you so a user can restore it if he deleted his app or switched to a new device. The functionality given by Google and Apple is very limited, however and you can easily implement a better functionality on your own.
Set up a server side for user verification
Make your own restore purchase function
Apply some rules on top of it (fraud protection, expiration, logs, ...).
To do that, you need to configure all products as "consumable" or in Google "unmanaged" and basically manage everything on your side.
I really wouldn't worry about it. No one is ever going to make an in-app purchase and then delete and re-download the app in the span of 10 minutes. If you have gotten it to work, you should be fine for any realistic case.

Restricting app store purchases to one per registered device. Is it possible?

I am working on a application which has a more peculiar requirement. Basically it is something which is not targeted at end users but at a system integrator who will embed an iPad into a larger system and sell it to an end user as a whole.
However, the problem I'm facing is that the system integrators could simply purchase the app once and then keep cloning thousands of iPads from a single iTunes account, my company would not get any revenue from this.
Is there any way around this. I've looked at in app purchases but according to the guidelines I'm supposed to give in app purchase restore functionality so I guess if I don't the app won't get approved.
I could use external authentication servers I guess, but that may be viewed as circumventing the app store.
I've loked at the volume B2B stuff but I'm not quite clear on how that works or if it would help me in this case.
Any ideas?
Thanks
Last time I checked an application can only be installed on five devices, and then the other ones simply refuse to install the application.
If this system integrator managed to circumvent this, it's he who is breaking the App Store rules.
You can't use the App Store mechanisms as you described (you can't change iTunes). In-App purchases of non-consumable items must include a restore option so the user can restore it on all his devices even if it's thousands (this also for subscriptions etc). If you won't enable that you would be rejected.
You can think you can send the Device-ID for each device that purchase the item and have control over that(or any information) but apple would simply reject your app because it's forbidden to send device-ID.
If your service is online you can simply use some kind of tokens created on your servers which would be given to each client (from some kind of private key), This way you must be connected to each purchased item (only those would contact your servers and you would grant access).
Security wise you must consider leaving some of the functionality on your server side. This is not illegal same as you can't access Facebook without username& password.
And now for the easy way, Define your service as consumable item for in-App purchase(if you can). What does it mean? Lets say you are selling a special feature like "Ad-Free" you can sell credits that would be consumed with each app open or any other process you have in mind, You can even set this credit to 1 million for 0.99$ (so the user never gets to that) but still the consumer would have to buy it again and again for each device and it would be absolutely legal by Apple. Pay attention that the problem would be on the consumer side such as that if user have deleted his app you should find a way to help him or refund him on next buy. Also, If you can and would use this method pay attention to save those credits on the restored folder on the device, so if the user would upgrade or restore the device he would still have the credits he bought.
Pay attention that if you are going to use in-App there are lots of methods to steal this content on jailbroken devices and you must use your own server to check the buying process (according to Apple).
Another important thing is that the app without the in-App purchase must have some value to the user.

Switching from a paid app to a free app with auto-renewing subscription

I have an app which costs $5. I'd like to change this so that the app is free and that users must purchase an auto-renewing subscription to use it. I know how to implement the auto-renewing subscription, but the problem is dealing with users who have already bought the app for $5; I'd like to continue letting these users use my app without a subscription.
The rub is that for privacy reasons I can't store any identifying information on my server which link an account for my app to a specific person (not even UIDID). What I can do is maintain a separate database table which links UIDIDs to subscription purchase receipts which will allow me to know if a user has a subscription.
So my question is, how can I identify users who got my app when it cost $5? I know there's a way to restore in-app purchase receipts, but is there a way to to retrieve a receipt for the initial purchase of the $5 app which I could store on my server?
The poor man's solution is just to mark all current UIDIDs (i.e. the UIDIDs of people who have paid $5) in my server as paid, but then they would have to buy a subscription if they ever wanted to use my app from a different device.
The previously selected answer is outdated. The new answer is that it is possible today with the new receipts that were standardized this year (2013).
The receipt now has two additional fields: original_application_version and original_purchase_date which can be used to detect when a user purchased and therefore be used to guide logic around what users should get what features.
You can see more about 10 minutes in here: http://devstreaming.apple.com/videos/wwdc/2013/308xex4x6ybggtlw4ztv0sg5btp/308/308-SD.mov?dl=1
or if that link dies here: https://developer.apple.com/wwdc/videos/ and search for Using Receipts to Protect Your Digital Sales.
Chaning your business model like this is not very well supported by the App Store.
Your "poor mans" solution is probably one of the best of a poor set of options.
Another one would be to switch to a new app entirely (just a different bundle ID in practice). Anyone using your old app would have paid, regardless of which device they use. Anyone using the "new" app would need a subscription. Obviously you'd lose any reviews and possibly external links that you currently have.

In app auto-renewable subscriptions

Sorry for the millionth question about iTunes subscriptions, but I still have a few doubts.
Basically I'm implementing auto-renewable subscriptions in my app and I want to make sure I got it right. Here's a list of steps to take that I came up with:
whenever an user buys a subscription, send the receipt to the server to validate it
if the receipt is valid, save it on the database
on application load, ask the server if a receipt for this UDID exists (this is to figure out if the user has a valid subscription)
if so, check if a new item has been added on the store in a date range from the subscription start date to the expire date
if any, notify the user about those items in some way and mark them as freely downloadable
Are these steps correct? And if so, why does the Apple doc say:
In most cases, your iOS client application should not need to change. In fact, your client application is now made simpler, as you can use the same code to recover auto-renewable subscriptions as you do to recover nonconsumable products. This is described in “Restoring Transactions.”Your application receives a separate transaction for each period of time where the subscription was renewed; your application should verify each receipt separately.
To me it looks like this needs some code to handle all the various cases I mentioned, instead. Or I'm totally wrong about it. Am I?
Plus, how do I know about the subscription expiration date? I can't find a way to get this information anywhere. Am I supposed to save this on my own database?
Update:
I've figured out a few things since I posted this question. Feel free to correct me if I'm wrong.
First of all I guess I'm supposed to store the length of the subscription somewhere on my own database, because as stated on Apple's docs, you cannot retrieve it in any way through Apple's web services. In fact, each subscription length has a different product identifier, so you should have a way to convert a product identifier to a subscription length.
Also, Sylvian has posted details about his implementation of auto-renewable subscriptions, so at least I know my thinking wasn't too much flawed.
Now the only problem is this: how do I know that an user has a valid subscription? I could store this information on my server, yeah, but how do I associate an user with a completed transaction? Should I save the device's UDID?
Here is how we implemented In App Purchases and specifically the new auto-renewable products at my company.
The application transmits the transaction receipt to our webservice, we return OK to the application if we handled it correctly and Apple could verify it. In that case we updated the user account (i.e. the database) to say "yes he has paid and his subscription is valid till the receipt expiration date".
After the OK for this webservice, the application reloads the account info through another webservice, and see there is a valid subscription. That was it... Until auto-renewable products appeared.
We now had to implement some CRON jobs which runs every day: every day we make a list of passes which are supposed to expire, and we ask Apple if the original receipt is still valid: the magic thing is that in their answer, there is a field latest-receipt which embeds the latest receipt. If it is not the same as the one we have, we understand that the subscription has been renewed automatically, we store the latest receipt for the next cron check, and we update the user account to extend the expiration date.
Hope it helps.
I think I found a solution. It doesn't require an additional username/password and it seems to be working.
Note: If you think this is inappropriate, please explain why in the comments. Thanks.
Basically, whenever an user buys a subscription, I validate the receipt against my server and store the receipt data in the user defaults. Then, when the app is opened, or whenever I need to check if the subscription is still valid, I retrieve the previously saved receipt data from the user defaults and validate it against the server.
My webservice just returns whether the subscription is still valid or has expired, plus some other related information such as the subscription length. To do this, it just queries the iTunes server as usual, and checks if the status response is nonzero. 21006 means that the subscription has expired.
If your app has some user management i.e. you use username/password to use the app, then you have to maintain a server to record the purchase/validity of the currently logged in user. This is applicable for normal subscription and non-consumable purchase. But... if you use the new auto-renewable subscription, then it's NOT possible to maintain multiple user in that app, because : this kind of purchase can not be done multiple times within the subscription period using the same Apple ID from the same application and I found it really annoying and finding a better solution for this case i.e where I have multiple child account in the app but I want to use the same Apple-Id to purchase a auto-renewable subscription for each account. And I think I have to use the old subscription model. Any new thoughts ?
as far as I have understand it the apple server will contact you (or the customer with his iPhone) and tell "look here I have a valid purchase for you". Inside your App you read this message and unlock the regarding content for use. The next step is to tell the apple server that you have responded to the receipt and the apple server will not show the message again.
So with a renewable subscription you get for each period a new message. Correct me if I'm wrong, please.

Transferring ownership of an iPhone app on the app store

My team and I have an app which we're going to be submitting to the store pretty soon, but we know that we'll be selling the app to another company in the near future. Does anyone have any experience with moving an app's ownership to another account?
Specifically, when I sell an app to another company...
How do we move the app to their account (what's the mechanism)?
Can my users still get updates (released by the new owner) without having to re-buy/re-download the app?
Starting June 11, 2013 this has officially become possible.
Here's the official note:
Dear developer,
Apps can now be transferred from one developer to another within iTunes Connect, for example after an acquisition or when a distribution deal expires. Transferring the ownership of an app does not affect the app’s availability on the App Store. All ratings and reviews will be transferred and your customers will continue to have access to all available app updates.
To transfer an app, go to the app’s App Summary page in the Manage Your Applications module on iTunes Connect and click Transfer App. Make sure that:
• Your account is active
• You have accepted the most current version of your contracts
• Your app has at least one approved version
• Your app is in the Ready for Sale, Invalid Binary, Rejected, Developer Rejected, or Developer Removed from Sale state
• Any associated In-App Purchases are in the Ready to Submit, Ready for Sale, Rejected, Developer Removed from Sale, or Approved state
• You know the Apple ID of the recipient’s Team Agent and their Team ID.
For more information on app transfer, see the video tutorial on iTunes Connect. To find answers to common questions about app transfer, see the FAQ on iTunes Connect.
Regards,
The App Store team
UPDATE: THIS ANSWER IS OUT OF DATE. IT APPEARS TO HAVE BEEN CORRECT AT THE TIME IT WAS WRITTEN. THERE IS NO NEED TO DOWNVOTE IT, BUT DON'T BELIEVE IT EITHER!
Official answer is No. From the iTunes Connect FAQ:
I sold my app to another developer and can no longer distribute on the
App Store. Can I transfer the app to
the new developer's iTunes Connect
account?
At this time, apps cannot be
transferred to another developer
account. If you would like the app to
be sold through another developer
account, you will need to remove the
app from sale in the current iTunes
Connect account and upload the app
under the new iTunes Connect account.
Uploading the app to a new iTunes
Connect account will disable current
customers from receiving automatic and
free updates of your application. All
customer reviews, rating and ranking
information will also be reset.
Additional resources that confirm this, from FutureTap developer Ortwin Gentz, back when he purchased WhereTo? from Sophiestication Software:
transferring an iphone app last episode
carved in stone transferring an iphone app
Follow Up: After all: it is possible (as of late March 2010).
I haven't read all comments or other threads about this issue, so this might be obsolete, but it seems it's basically related to the iTunes-related structure of the appStore.
You can't be part of the Beatles and the Rolling Stones Bands...
Anyway, eventually, a colleague managed to get things sorted out, and we got our App (which was running under my private, single Dev account) running under a new, enterprise account. We kept our ratings, our #1 place in our category in the appstore, and all in all it went smooth (after several hours of phone-calls with apple).
As far as I can recall, the main problem was those help-desk folks were knowing things were going to change, but they didn't know by when and how. Probably due to iPad coming and related timelines involved). Anyway. It's possible, and it's pretty easy. Send your request, wait a couple of weeks (might be days by now), and you'll have the transfer. One issue though: They may have some bug in their migration code, because apple mixes firstname and lastname of the dev / master account after migration. well, who cares.
I had my own experience with this, and the answer I got from Apple Developer Relations (Although it took a month to get an email response and 6 weeks for the follow up phone call) was (in short) that they currently don't offer any way to transfer individual applications from one developer account to another.
He did so by saying that there was a single "Option" for doing this sort of transfer, which is to delete the app from the account that it is currently on, and then resubmit to the Apple store from the new account under the same name (but it would have a new appstore id). I pointed out (and he acknowledged) that this would delete any existing user reviews, ruin the upgrade path for existing users, break iAds, in-app purchases, and game center integration. So it really isn't a solution at all.
He also said that it isn't possible to transfer ownership of all your apps to another existing account (they seem to lack the granularity to move individual apps). However if I wanted to give up all my apps to another individual it could be possible by creating a corporation (probably S-Corp, although he didn't advise), transferring ownership of my account to the S-Corp (which would be allowed if I were a part owner), and then selling the s-corp to the new owner. (Yikes right?)
The method I plan to go with is the following (I'll update with my success), In my specific case I have a paid application that (.99) that I'm trying to transfer to another owner:
I will create a lightweight application using the same AppID that is designed to inform users that the Application has changed owners, and provide a link to the app store where they can download the new application. When launched will upload a hashed form of their UDID to a server (which I will now have to maintain) listing them as a previous customer.
I will upload this new lightweight app to my existing account as an upgrade to the other existing application (so that when users update, they will instead be marked as an existing customer, be presented with a message explaining the situation, and a link to the new app)
I will convert my paid app to being a light application that has some functionality, but requires an in-app purchase of .99 to get the full functionality. Additionally, this new app will check with my server to see if the UDID is in the existing customers database, and if so give them full functionality (without having to do the in-app purchase).
... ARGHH! :) It's an ugly experience for the customers and a whole hell of a lot of work for the developer... but the only option provided by Apple. (Although, I'm not sure that it will even work, as it's entirely possible that they will reject my lightweight "update" application from the store, and thereby prevent the hack upgrade path as well)
UPDATE: Too much work for the person that I was trying to give the application to. Ended up not proceeding with the plan. Think that it could probably still work, and would love to hear from anyone who tries it or pulls it off :)
iTunesConnect now allows App Transfers given certain app restrictions (no iCloud or Push Notifications apps are allowed currently. Local Notifications are ok, of course.)
See the iTunesConnect FAQ on App Transfers... https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/wo/10.0.0.9.1.0.9.1.5.10.1
You can only initiate or accept a transfer if your iTunesConnect login has the "Legal" role permissions.
AFTER THE TRANSFER:
The teamId and bundleID will not change at all. Nor will any of the in-app purchase Ids.
In my company's developer account, I now see an app with EXACTLY THE SAME TeamID.BundleID as I saw in the source code that was purchased from the other company (and that source code was delivered separately, not via Apple)...
ex. BundleID = com.<some-other-company>.<purchased-app-name>
This bundleId is now listed among my other apps listed in iTunesConnect's Provisioning Profiles. I simply created new Development and Distribution/AdHoc provisioning profiles for my newly purchased app. Then I downloaded the new provisioning profiles into Xcode, just like for any of your own apps.
Quite painless. Thank you Apple.
What Lou Franco said.
Where To example is really good to consider, as they eventually had to settle for the fact that all existing customers need to buy the app again. Apple simply does not have the background infrastructure to change ownership.
Another bad consequence of the inherited made-for-music-sale-machine that iTunes originally was. Songs apparently don't change owners.
See here, for Where to resolution: transferring an iphone app last episode
Since now, this is now possible using iTunesConnect.
Apps can now be transferred from one developer to another within
iTunes Connect, for example after an acquisition or when a
distribution deal expires. Transferring the ownership of an app does
not affect the app’s availability on the App Store. All ratings and
reviews will be transferred and your customers will continue to have
access to all available app updates. To transfer an app, go to the
app’s App Summary page in the Manage Your Applications module on
iTunes Connect and click Transfer App. Make sure that:
Your account is active
You have accepted the most current version of your contracts
Your app has at least one approved version
Your app is in the Ready for Sale, Invalid Binary, Rejected, Developer Rejected, or Developer Removed from Sale state Any
associated
In-App Purchases are in the Ready to Submit, Ready for Sale, Rejected, Developer Removed from Sale, or Approved state
You know the Apple ID of the recipient’s Team Agent and their Team ID.
From what I understand, this can be done, but it requires manual intervention by the iTunes Store team, can take months to go through, and may involve some periods when your app is not on sale under either account. If you know who your customer is going to be, just put it under their account to begin with. If not, remember for the future that flipping apps is not an easy thing to do, and adjust your business model accordingly.
It is possible since June, 2013. You can transfer an app to another developer very easy - here is an official FAQ from Apple (available for registered developers).
Besides the already mentioned things I recognized, that certain issues may arise which are nowhere mentioned in the AppStore Guidelines or the documentation.
I found out several issues with apps having subscriptions (which are as of Jan 2015 not transferrable). After trying to transfer an app I found out via the FAQ in the iTC Developer Support Center aka Help Section the following things (Link to FAQ section)...
You cannot transfer apps that contain or use:
iCloud entitlements in any version of the app
Passbook entitlements in any version of the app
A SKU that matches the SKU of one of the recipient's apps, including previously-removed SKUs
In-App Purchase product IDs that match the In-App Purchase product ID of one of the recipient's apps, including previously-removed In-App Purchases
Approved auto-renewable, non-renewing, or free subscription In-App Purchases, including previously-removed In-App Purchase subscriptions Sandboxed Mac apps that share the Application Group Container Directory with other Mac apps also cannot be transferred.
To transfer any of these types of apps, the recipient must create the app as a new app. Current customers, ratings, and reviews cannot be transferred to the new app.
Also the usual requirements are:
To transfer an app, make sure that:
The transferor and the recipient have active developer accounts and accepted the most current version of all master agreements that are currently in effect
The app has at least one approved version
The app is in the Ready for Sale, Invalid Binary, Rejected, Developer Rejected, or Developer Removed from Sale state
Any associated In-App Purchases are in the Ready to Submit, Ready for Sale, Rejected, Developer Removed from Sale, or Approved state
You know the Apple ID of the recipient’s Team Agent and their Team ID If the app uses iAd, the transferor and the recipient must have accepted the most current version of all iAd contracts.
Hope that helps avoid mishaps before you try to transfer an app.
As ownership transfer is currently not-supported and an "exception process", it makes sense not to count on it as your mode of operation.
The big problem you're facing is: the app is tied to a developer account and you want to keep YOUR developer account after you transfer the app.
Hence, why not set up a NEW developer account, the sole purpose of which is to be the holder of this one app and, when you sell the app, you can just transfer the developer-account credentials to the new owner.
At that point, they can update the name, address, company name, bank info, etc.
Of course, your transfer contract will have some verbiage explaining how, in the interim, any moneys you get from Apple will be fwded to the new owner (put a time limit -- like 90 days -- on this so they don't take forever to update the info.)
I've not tried this, but it seems like a viable solution. Again, the problem is that the app is tied to developer account and you don't want to transfer yours. Hence, this Just Makes Sense™.
Recent update from iTunes Connect:
I sold my app to another developer and can no longer distribute it on the App Store. Can I transfer the app to the new developer's iTunes
Connect account?
No, you can’t transfer the app to another developer account on iTunes
Connect. To add the app to another account, remove the app from the
current account and upload it to the new iTunes Connect account.
Note that uploading the app to a new iTunes Connect account will
disable current customers from receiving automatic and free updates of
your application. All customer reviews, rating, and ranking
information will be reset. You will not be able to reuse the app name
and SKU in the old account. If you have uploaded a binary or used the
app with the iAd Network, your Bundle ID will not be reusable either.
Guess I'm late to the party but Apple just added a button to iTunes Connect to do just this. Sign into your iTunes Connect account, go to 'Manage Apps' and click on the app you want to transfer. In the section on the top right, there's a button to transfer your app now.
Cheers!
As far as I know there is no way to transfer apps to a different user/company. I think the app should be in your customers account from the beginning. Otherwise you probably have payment problems too (people paying you instead of your customer).
Why not just sell the app to a customer before releasing it. If they want to see it running before it is released, just sent them a version built with an ad-hoc certificate.
The are additional considerations:
If you just can switch ownership of the Application behind the scenes, thus changing the contract, but not the application itself, you might be fine.
But if you're just going to transfer your source code, the future owner of the app will have to sign it with his own certificate, which will basically render the app as a "new" one.
Users will lose their settings (if your app did some configuration persistence) and they'll lose the app history in the appstore (ranking, etc.).
As per a new announcement from Apple today (just after iOS 7 release) this has become possible .
It says "Apps can now be transferred from one developer to another within iTunes Connect, for example after an acquisition or when a distribution deal expires. Transferring the ownership of an app does not affect the app’s availability on the App Store. All ratings and reviews will be transferred and your customers will continue to have access to all available app updates."
Something helpful:
Apple site documentation with new itunesconnect UI released in Sep,5,2014
Transfer code using github
Note: Use agent role account, and maybe you should click "Agreements, Tax, and Banking" to request Contracts first.
I don't believe that you can transfer ownership to another account. But a simple solution would be to add URL schemes to your app to allow data to be transferred from your app to a new app that your customer would release with the same source.
The new app would have to be free though (maybe the lite version?), so your old customers wouldn't be forced into buying it again. The only real downside I can see of this is that the new app would basically be starting over again from a marketing perspective, which is no minor thing of course!
Mobile Orchard had an article on data migration from Lite to Paid versions of an application that may be of interest:
Lite-to-paid iPhone application data migrations with custom URL handlers