views:

509

answers:

3

I have existing users of a paid for app on the App Store. I'd like to transition the app to a free app with unlock-able features. Is there a way to roll my existing users into this new free version that allows a paid "upgrade" so the existing users are treated as if they've already paid for this upgrade? OR, as I expect, must we maintain two separate code bases as app development moves forward - in lieu of angering our existing customers by forcing them to purchase again?

I'm aware that initially there prolly won't be many authoritative answers to this question as Apple has only today started allowing support for In-App Purchases from within free apps...

+2  A: 

You shouldn't need two separate code bases - use conditional compilation and build two targets.

Cade Roux
I would add to this, and make it a marketing opportunity - use one code base with two outputs, but include some kind of bling or special feature for the people that bought the app outright that doesn't even get unlocked from the free version. That would make the people that already bought feel special instead of suddenly being the unwanted stepchild.
Kendall Helmstetter Gelner
+3  A: 

One possible solution might be to place code in a new update of your paid application that would flip whatever switch you'd use to identify paid customers (be it in a property list or other form). If you give your existing paid customers enough time to upgrade, they should be marked as having paid. Then, make your paid version the free / paid upgrade version and remove your existing "Lite" version from the store. New customers will have to use the in-app purchase to unlock the full version, but existing customers will be acknowledged as having already paid.

A problem with this is how to get all of your existing customers to upgrade to the intermediate version that flips the "paid" switch in time to migrate the application to the free / paid upgrade model.

Brad Larson
I thought about this but realised that if someone deleted your app and reinstalled it they'd revert back to the "lite" version. Maybe this happens infrequently but I'd be annoyed if it happened to me.
Stephen Darlington
Yes, I think you'd probably want to have a server-side component to this, as well. That way, some sort of unique ID would be logged with a server for the previously paid customer, and the free application could also check this if the local copy hasn't been marked as paid. You wouldn't want to just use a device ID for the unique identifier, though, because you want the paid version to transition across to a new device that a user may upgrade to in the future. It's a tricky problem.
Brad Larson
+3  A: 

is there's some way you can tell if your app has been run before? (like settings you write on exit, data files created, date stamp of first run?)

if so, you could put code in your upgrade like:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (nil == [defaults objectForKey:@"app_v2_has_been_run"]) {
    if (nil == [defaults objectForKey:@"some_key_v1_makes"] {
         // they never had v1 of your app
    } else {
         // they had v1 of your app, so unlock some stuff for them
    }
    [defaults setObject:[NSDate date] forKey:@"app_v2_has_been_run"]; // or whatever
}
David Maymudes