iOS - transferring in-apps between apps - iphone

I am working on a project that was not initially developed by me and this project is an iphone application with a lot of in-app purchases and these in-app purchases are large images stored inside the app. These images make the app big in size (~ 70 Mb). This app is compatible with iOS 4.x and up.
With the launch of iPhone 5 and iOS 6, the company wants to create a brand new application, just compatible with iOS 6 and leave behind all legacy support of the previous version. This new version will store the in-app purchase images on Apple servers and this will make the app size drop to 3 Mb. But, on the other hand they don't want to abandon those who bought the in-app purchases, they want to create a scheme where users could transfer the purchases from the old version to the new one.
I know this can be accomplished by having a server on our side and setting up an application and a database, but their limited budget right now is prohibiting this. So, is there a way to do that using exclusively the application and iCloud (or whatever on Apple side)?
I was wondering if this could be used to do this. I mean, can I use the key-value store stuff to do this? Or in other words: can two apps have the same com.apple.developer.ubiquity-kvstore-identifier?
thanks.

It's possible to transfer data from one app to another quite easily if your users have both apps installed, however it's not possible to transfer in app purchases from one app to another.
What you'll have to do is update your legacy app to support some kind of action or link to the new app, then open the new app from within the old app with UIApplication openURL: and pass through some meta data about the upgrade.
Then from within the new app your app delegate will receive didFinishLaunchingWithOptions: with the URL used to launch the app, you can then download their purchase.
This functionality is supported by registering URL scheme for you new app, which is an info.plist setting.
A problem you're going to have with the above transfer of purchase meta data between the old app and the new one will be the fact that restoring their purchase will not be possible via StoreKit/Apple (as noted above, transfers are not possible).
You could get around this issue and provide your existing customers with the ability to restore their purchases if you had two in app purchase SKUs for your new app.
One item is the usual item that new customers will need to pay for, the other is identical but $0 for existing customers to 'buy' so they have a purchase registered with StoreKit/Apple for them to restore in the future without the old app.
The new app can conditionally display this $0 option for existing customers if they've upgraded via the method above.

Related

Verifying the purchase (receipt) of another application (Mac App Store)

TL;DR: Is there a way to verify that a user has purchased another app (of mine) from the Mac App Store?
In a brief, I want to completely rebrand one of my applications on the Mac App Store. The current version is very buggy and has a user base of nearly 90% pirates. I want to shut down the old application and completely rebrand it as a new product.
However, I don't want to completely screw over my current, legitimate customer base. I am hoping there is a solution to this. The way I was hoping to go about this was to:
Create a new application – completely rebranded
Make it free
Have an In-App Purchase that unlocks the Pro version
Allow customers of my previous app to "restore their purchase" to unlock the Pro version
The new app will have extensive anti-piracy measures. Furthermore, the current application requires a connection to one of my servers. When I release the rebranded app, I will shut down the current app.
I realize the forcing users to migrate may cause some backlash; however, I am hoping that, by providing the new and improved version 100% free, the backlash will pass.
Look for the old app using NSBundle bundleWithIdentifier
get the receipt of this bundle using appStoreReceiptURL
validate the receipt
unlock functionality
Bare in mind that the terms and conditions of Apple say something along the line of "only appstore IAP should be used to unlock features; don't roll your own license mechanism"

How to use another Apple ID to submit an already-online iOS app to the App Store?

My company had outsourced an iOS app to another company, and they published the app on the App Store using their Apple ID. The app have been available for download for a few months and has a number of users. Now my company developed a slightly newer version of the app and would like to distribute the app using our own Apple ID. What's the correct way to do it? The major concerns we have are:
Should we submit the newer version using our ID before or after we take the old app down from the App Store. Would it happen that the newer app get rejected because Apple feel the two apps are too similar? (Actually they are quite similar, for that the update is slim.)
Is there a graceful way to notify the currently online app's users that they should switch to the newer app? And How to coordinate it, since the newer app may take a certain amount of time to get approved.
Thanks.
There are some different scenarios here, I am going to try to address some of them to see which one helps you the most:
1-)You have a current application that contains no use of push notification and no use of in app purchase. This is the easiest one. Basically, It does not matter what version the user has had before. You can remove the old one from the previous developer account and add it to the new developer account. By completely removing the previous application (not just from the app store listing, but from the developer account), you can reuse the bundle ID. When the user reinstall the app, the user will be able to replace the old application with the new application (note that the new application will not appear on the user's update list).
2-)You have push notification. Here, you will have to keep the old application if you wish to maintain the push notification certificates, so, the new application will have to use a new bundle ID, which means that the app will appear on the user as a new application, and the user will be able to have both app simultaneously.
3-)You have in app purchase and subscriptions. You will need to remove the old in app purchase entries from the old developer account, and add it to the new account (if you wish to reuse the product id, if not, you will have to create it either way).
I am not sure what kind of measure you need to take if you are using iCloud and/or other services. Best course of action is to contact Apple developer support. They will give you some guidance on what to do with your specific case. Also, when submitting, make sure to point to the reviewer that you are trying to move the application from one company to another. I think they can access review notes from the review to the previous submission(instead of reviewing it as a new app), and speed up the process.
Edit: You can not transfer apps between companies using iTunes connect. More information here: link

Allowing user to purchase Paid app version from within Free version?

Got a general question(s) for you on implementing a free and paid version of an app.
I have it setup now where I have 2 targets within the 1 app/project and I specify with the def syntax for what is in the lite vs paid version.
It works and runs both targets.
1) How do I have the user purchase the paid app directly from the free version? (Found multiple older articles saying linking is fine and others saying that will get rejected and must use in-app purchase)
Can I use a link tied to a tab bar item or button like this,
NSString *iTunesLink = #"http://itunes.apple.com/gb/app/wired-news-uk/id435728870?mt=8";
[[UIApplication sharedApplication]
openURL:[NSURL URLWithString:iTunesLink]];
OR do I need to implement the storekit for an In-App purchase?
2) I was going to put a new Tab Bar item at the bottom (to link to paid version) - haven't tried yet but I should be able to setup the tab bar one way for the free version and another way for the paid version, correct? Essentially, hiding the tab bar item to purchase the paid version once upgraded.
3) Submitting each app (free and paid) version to the app store - I'm assuming I will be able to set the target and archive the binary for upload for each, right? Two separate app submissions in itunesconnect?
I have several Lite/Paid app pairs in the app store (all were originally created before IAP existed). I've made many updates to these apps over the years so it seems Apple is fine with the idea in general, if you do it right.
1) You can't actually purchase the paid app from inside the free app. The best you can do is send the user to the store for your paid app.
2) That should work. In one of my apps, I have an extra icon in the main toolbar that brings the user to the app store page for the paid app.
3) Yes, you submit two completely separate apps. You setup two apps in iTunes Connect each with their own unique app id.
A single project with two targets is the easy and proper way to setup your code. For me, I do two archive builds, setup two apps or app updates in iTunes Connect, and submit the two apps/updates to iTunes Connect. I always keep both apps in perfect sync. Apple always seems to review them together and always pushes them out to the store at roughly the same time. Only once did the two get approved more than an hour or two apart.
The main thing you must be careful with is the free version. It can be "Free" or "Lite" but not "Demo". The free version must fully function. DO NOT have any UI elements in the free version that are disabled because they only work in the paid version. It will get rejected. If it doesn't work in the free version, make no mention of it at all in the free version.
Most of my app pairs, the free version allows for limited data compared to the paid version. When the user attempts to add data beyond this point, I popup an alert with a nice reminder that the free version a limit and offer them the chance to upgrade. Other than this, there is no other annoying popups offering the paid version. It's OK to have a button or whatever in the free app to let the user upgrade, just don't shove it their face or popup any sort of reminder after X uses or time. A free version of an app must fully function in its own right.
Here's my take on free/paid app pairs versus IAP:
Cons of IAP:
- No promo codes for IAP
- You can't make IAP free for some period of time (sale or whatever)
- Free apps tend to get lower ratings because any yahoo can download.
- Extra coding for IAP
Cons of free/paid pair:
- Two targets, two app releases, two sets of images, two sets of stuff in iTunes Connect
- Split downloads and ratings/reviews.
Personally, since I've been doing this for several years now, the extra effort of submitting two apps is trivial.
Edit:
One thing I forgot to mention - there is still no guarantee that Apple will accept the apps this way. But there are plenty of examples of such apps so it should be OK if done correctly.
If you want to have two apps, then you must have two technically independent submissions with different app id-s. It may be tricky to have it from the same project, not sure if you can do it using two targets. Technically AppStore rules do not allow "upselling" paid version from free one, but if it is not too aggressive, then maybe it will be approved. Safe solution would be to use InApp Purchase, this gives you many benefits:
quite is easy to implement
no need for two application codebases
you have single download count and item in appstore
Actually this solution with two separate apps made sense before in-app purchases, I do not see much point of that today.

Workaround to lack of promotional codes for in-app purchases

Apple doesn't offer promotional codes for in-app purchases. What's the best way to let users try the features or content unlocked by in-app purchases for free, while complying with Apple's Developer Guidelines?
The idea is to allow a special set of users (reviewers, key fans, etc.) to access the content or features offered as in-app purchases without paying.
Examples of apps that worked around this limitation would be much appreciated.
You could submit a version of your application that has all features unlocked by default.
Submitted apps have a publish date that you can set when you submit (and I believe you can change this on the fly as well) you could simply prevent the app from being published in the App store but still be able to give promotional codes for it.
Promo codes apply to a specific app version, so when users redeem promo codes for a version of an app that hasn’t been released yet, they download the prerelease version.
Source
Something like shareware? An app, that has a subset of features enabled until in-app purchase? Apple allows it now.
As example. We've a puzzle game, that has 12 difficulty levels. 4 or 5 of them are available for free and others are unlocked after in-app purchase.
I'm working on this now.
What I'm doing is I generate a random code/guid and store that on my webService's DB. Then give that code to who ever you want. They enter that code and it calls the web service passing the code, and device UDID. The webService returns another code indicating if that promocode was valid. If valid then the app will add that purchase to NSUserDefaults or Core Data (however you keep track of purchases).
If you don't have a server up and running (say the content is already in the app bundle) and you don't want a server would require you making an algorithm to generate keys that your app validates. However this is far less robust. Using a web service allows you to prevent 1 working key from being distributed between all users, as you can tie 1 promo code to 1 device.

what is the differences of purchase in app and create your own link to pro version?

I want to create two version apps: lite and pro.
I look through purchase in app guide , but it is not allowed to change the lite version code to add functionality. you can just pop up an store UI to link the user to pro version, right?
But in this way, we can do it ourself, we copy the link of pro version in the appstore ,then pop up a dialog guide the user to app store?
I know that purchase in app can download new resource to the app,I may miss something about adding new function to the app?
thanks for your guys!
What programming language is this in? I don't have an 'app store' structure in my language...
As far as I understand, "in app purchases" on iPhone apps are not meant to download new code, but rather to unlock new features in your app. By the way, the iPhone OS does not allow applications to dynamically link and execute code at runtime (security reasons) that is why your application must be shipped with all the features inside, and the "in app purchase" feature will allow you to unlock features paid by the user.
You can, however, enable your application to access new data (for example a new URL or another embedded database) but not new binary code (like plugins or extensions). This new data might unlock more features, after the payment is approved by the App Store.
Given that now you can add "in app purchase" in free apps (this wasn't possible a couple of months ago), you can release a free "lite app" which can be upgraded with options later on. Which defeats the purpose of having a separate lite app with a link to the paying "pro app".
I hope this answer helps you!