2011-10-16 7 views
7

私のアプリでは、ユーザーは消耗品を購入します。スーツケースはCore Dataに保存されています。ユーザーが最初にアプリをインストールするとき、私は彼らに始めるための無料サービスを提供します。少なくとも1つのスーツケースが設定されていなければ、アプリは機能しません。iCloudを使用すると、ユーザーはアプリ内消耗品を「盗む」ことができます

しかし、ユーザーが自分のiPhoneにiPadをインストールし、iPadを同期して2台を同期させると、2つのスーツケースが追加されます。そして、いずれかのデバイスでアプリをアンインストールしてから再インストールして同期すると、余分なものが得られ、無期限に実行できるようになります。

私は2つのソリューションを見ることができ、それらのどれも思えるん:ユーザーは最初のiCloudと同期するとき

  1. はNSUbiquityKeyValueStoreに値を追加します。最初の起動時にこの値を確認してください。それがない場合は、データを同期させてください。しかし、これは問題を作り出します。ユーザーがiCloudを無効にした場合、または初回起動時にインターネットに接続していない場合はどうなりますか?アプリはフリーズを作成し、iCloudが利用可能になったら、複製を同期させ、好きなだけ何度でもこれを行うことができます。

  2. いずれの場合も、各アプリのデフォルトの項目と一致します。私はオブジェクトIDやタイムスタンプにマッチするアイデアを持っていましたが、これらは様々で、どのように扱うべきかわかりません。

私はこれについて何かできることは誰も知っていますか?

EDIT:パッケージ化されたデータベースに加えmigratePersistentStoreを使用して

:toURL:オプション:withType:エラー:移動するための方法のようです。それが私のために働くなら、コードで答えを投稿します。

+0

たぶん、あなたの例では、単に混乱ですが、彼らは既に持っている場合は、なぜ彼らに無料のスーツケースを与えないだけで決してありませんか?あなたは、スーツケースなしではアプリが機能しないと言うでしょう。あなたが以前にスーツケースを持っていて、それを消費したら、それが機能することを意味しますか? –

+0

@chrispix例を非常に抽象的にして申し訳ありません。基本的に、あなたはスーツケースを「消費する」ことはしません。あなたはあなたが好きな数だけ購入し、それらを蓄積します。それは無制限なので、「消耗品」モデルですが、購入時に商品が実際に「消費される」というわけではありません。これは主な違いです。 – ntesler

+0

私は見ると思います。ユーザーが再インストールしてスーツケースがないので、あなたはそれらを1つ与えます。その後、彼らはあなたのサーバーから以前のスーツケースをプルダウンできるいくつかの資格情報を入力しますか? –

答えて

0

私の意見では、これに対する最良の解決策は、iCloud UbiquitousKeyValueStoreの配列にUDIDを格納することです。

//Store UDID in iCloud 
if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 5.0) { 
    if ([[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]) { 
     NSUbiquitousKeyValueStore *store = [NSUbiquitousKeyValueStore defaultStore]; 

     //Get array 
     NSMutableArray *devices = [NSMutableArray arrayWithArray:[store arrayForKey:@"UDID"]]; 
     [devices addObject:[[UIDevice currentDevice] uniqueIdentifier]]; 

     //Create new array, set to kvstore 
     NSArray *newDevices = [NSArray arrayWithArray:devices]; 
     [store setArray:newDevices forKey:@"UDID"]; 
     [store synchronize]; 
    } 
} 

...

//Check if app already installed on device 
    NSArray *devices = [[NSUbiquitousKeyValueStore defaultStore] arrayForKey:@"UDID"]; 

    for (NSString *UDID in devices) { 
     if ([UDID isEqualToString:[[UIDevice currentDevice] uniqueIdentifier]]) { 
       //stop the giveaway 
     } 
    } 
+2

... UDIDはもう保存できません – 3zzy

1

iCloudの使用は、ネットワーク接続を意味します。デバイスがネットワークに接続するとすぐに、自分のサーバー上の消耗品の領収書とログを検証することができます。

+0

私はそれを設定するのに必要なスキルはありませんが、私はiCloudのUbiquitousKeyValueStoreを使うのは何もしないほうがよいと信じています。 – ntesler

3

領収書の有効性を確認しておらず、ユーザーが自分のサーバーで所有している消耗品を把握していないと、間違ったことが起こります。あなたは基本的に、ユーザーがまともで正直であることを信じています。これは、通常、常に悪い考えです。

アプリ内消耗品を使用するときは、ユーザーが購入した場所のどこかにログを保存する必要があります。そうすれば、あなたのアプリが起動するたびに予想される消耗品の数がサーバにあるかどうかを確認することができます。

+1

一般的にあなたの顧客を信頼することは大丈夫です。おそらく盗む人は、最初に支払うことはありません。また、あなたが素敵なアプリを持っている場合、彼らは技術に精通していない人々にそれを買うように伝え、より多くの売り上げを得るでしょう。そのトリックは、物事を買うことを回避する方法を明白にすることです。 –

+0

問題はアプリ内購入ではありません。あなたが言うように、領収書を検証できるからです。トリッキーなビットは空き金であり、どのように各ユーザがフリービーを1回だけ得ることができるかを保証します。 – Nestor

関連する問題