web-dev-qa-db-ja.com

iPhone-アプリ内購入の消耗品の正しいアプローチ

消耗品のアプリ内購入を使用する、作成中のこの新しいアプリがあります。

私の質問はこれです:それはどのように機能しますか?つまり、ユーザーが消耗品を購入すると想像してみてください。そのため、販売を完了した後、アプリのデータベースにそのオブジェクトの使用を許可するフラグを設定しました。ユーザーが何らかの理由でデバイスを紛失し、すべてを復元する必要がある場合に備えて、古いトランザクションを復元するためのボタンをユーザーに提供する必要があることをどこかで読みました。

ユーザーがすでにその購入を使用し、その後、古いアプリ内購入を復元するとします。それではどうなりますか?ユーザーは再び同じリソースを使用できるので、料金を支払わずに2回目に使用できますか?それはどのように機能し、どのようにアプローチする必要がありますか?

ありがとう

27
SpaceDog

サーバーを必要としないという大きな利点がある、この問題に対して私が見つけたやや非正統的な解決策を共有したいと思いました。この方法では、アプリが削除されて再インストールされた場合、ユーザーは消耗品を復元できますが、アイテムを新しいデバイスに移動することはできません(すべてのアプリデータがコピーされない限り)。

キーチェーンに保存されているデータは、アプリを削除して再インストールしても保持されます。キーチェーンは、ユーザー名とパスワードを保存することを目的としていますが、消耗品の購入に関する情報をそこに保存することもできます。ここで入手できるKeychainItemWrapperクラスを使用しました: https://developer.Apple.com/library/content/samplecode/GenericKeychain/Introduction/Intro.html

これは、ユーザーが残っている有料ヒントの数を保存および取得するサンプルコードです。

//Storing the consumable hint item count
int hintsLeft = 100;
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Hints" accessGroup:nil];
NSString *hintsString = [NSString stringWithFormat:@"%i",hintsLeft];
[wrapper setObject:hintsString forKey:(id)kSecValueData];
[wrapper release];

//Retrieving it
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Hints" accessGroup:nil];
NSString *numHints = [wrapper objectForKey:(id)kSecValueData];
[wrapper release];
int retrievedHints = [numHints intValue];

ノート:

  • キー(id)kSecValueDataを任意の文字列にすることはできません。キーとして使用できる定数のセットリストがあります。

  • セキュリティフレームワークを追加する必要があります

67
user1139733

StoreKitは、非消耗品のリカバリ機能のみを提供します(一部はサブスクリプションの場合もあります)。したがって、消耗品の場合、restoreCompletedTransactionsを使用してリカバリしても、ケースでトランザクションは配信されません。消耗品に関する情報の復元の処理は、アプリやサーバー内で行う必要があります。

さまざまな製品の性質を参照するには、 アプリ内購入プログラミングガイド:アプリの製品の設計 を確認してください。毎回購入しなければならない消耗品製品があります、非消耗品一度だけ購入し、そのユーザーのiTunesアカウントに関連付けられているすべてのデバイスに提供される製品、自動更新可能サブスクリプションおよび非-サブスクリプションの更新

28
marcus

IOSで消耗品をローカルに保存する方法を探している人は、PDKeychainBindingsController( https://github.com/carlbrown/PDKeychainBindingsController )を参照してください。

NSUserDefaultsのように機能し、購入した消耗品の数をiDeviceのキーチェーンに保存するために使用できます(キーチェーンに保存されているアイテムは、アプリの削除中に削除されません)。

以下のようなコードを使用して、キーチェーンから値を保存および取得します。

- (NSUInteger)hintCount {
    PDKeychainBindings *wrapper=[PDKeychainBindings sharedKeychainBindings];
    NSString *valueString = [wrapper objectForKey:@"hintCount"];
    int value = [valueString intValue];
    return value;
}

- (void)setHintCount:(NSUInteger)starCount {
    PDKeychainBindings *wrapper=[PDKeychainBindings sharedKeychainBindings];
    NSString *valueString = [NSString stringWithFormat:@"%i",starCount];
    [wrapper setObject:valueString forKey:@"hintCount"];
}
5