web-dev-qa-db-ja.com

有料アプリを無料に変更するが、ユーザーが以前にそれを購入したかどうかを知る

有料のiOSアプリを無料に変更してad based、およびin-app purchaseオプションで広告を削除します。

これは、アプリを起動したばかりの場合は良い考えのように思えますが、3万回以上の有料ダウンロードがあり、無料の新しいバージョンに更新したときに広告が表示されないようにしたいと思います。

ここにオプションはありますか?

36
Nic Hubbard

IOS 7以降、これは適切なレシート検証を使用して行うことができます。 iOS 7では、購入したアプリのレシートを取得できます。領収書のデータの一部には、ユーザーによるアプリの最初の購入バージョンに関する情報が含まれています。そのバージョンを確認し、IAPを使用した無料のアップデートのリリース前のバージョンである場合は、ユーザーがアップグレードを再度購入することなく、ユーザーに完全な機能を提供することを選択できます。

もちろん、更新したアプリをiOS 6で動作させたい場合、これはオプションではありません。

レシート検証の詳細については、 レシート検証プログラミングガイド を参照してください。

66
rmaddy

すべての領収書を取得して、次のデータで分析してみてください。

"expires_date" = "2017-09-24 11:25:19 Etc/GMT";
"original_purchase_date" = "2017-09-24 11:20:21 Etc/GMT";
"product_id" = "com.yourapp.service";

1。アプリストアからすべてのユーザーのレシートを取得します

+ (NSArray*)all_receipts{
    // Load the receipt from the app bundle.
    NSURL *receiptURL = [[NSBundle mainBundle]appStoreReceiptURL];
    NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
    if(!receipt){
        //no receipts yet...
        return nil;     
    }

    NSError *error;
    NSDictionary *requestContents = @{@"receipt-data": [receipt base64EncodedStringWithOptions:0],
                                      @"password":YOUR_SECRED_SHARED};
    NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents
                                                          options:0
                                                            error:&error];
    if (!requestData) {
        return [NSArray array];
    }

    // Create a POST request with the receipt data.
    //get current qa / production url
    BOOL sandbox = [[receiptURL lastPathComponent]isEqualToString:@"sandboxReceipt"];
    NSURL *storeURL = [NSURL URLWithString:@"https://buy.iTunes.Apple.com/verifyReceipt"];
    if (sandbox) {
        storeURL = [NSURL URLWithString:@"https://sandbox.iTunes.Apple.com/verifyReceipt"];
    }
    NSDictionary *jsonResponse = [LTServer postUrl:storeURL.absoluteString attach:requestContents];
    NSLog(@"jsonResponse %@",jsonResponse);
    if(!jsonResponse){
        return [NSArray array];
    }
    NSArray *receipts_data = jsonResponse[@"latest_receipt_info"];
    return [receipts_data mutableCopy];
}

2。各レシートには辞書が含まれます:

    "expires_date" = "2017-09-24 11:25:19 Etc/GMT";
    "expires_date_ms" = 1506252319000;
    "expires_date_pst" = "2017-09-24 04:25:19 America/Los_Angeles";
    "is_trial_period" = true;
    "original_purchase_date" = "2017-09-24 11:20:21 Etc/GMT";
    "original_purchase_date_ms" = 1506252021000;
    "original_purchase_date_pst" = "2017-09-24 04:20:21 America/Los_Angeles";
    "original_transaction_id" = 1000000339209266;
    "product_id" = "com.yourapp.service";
    "purchase_date" = "2017-09-24 11:20:19 Etc/GMT";
    "purchase_date_ms" = 1506252419000;
    "purchase_date_pst" = "2016-11-27 04:20:19 America/Los_Angeles";
    quantity = 1;
    "transaction_id" = 1000000337203266;
    "web_order_line_item_id" = 1000000030161297;
1
Ofir Malachi

現在のアプリにユーザーのデフォルトまたはキーチェーンにデータがある場合、それが指標になる可能性があります。 (新しいバージョンで)アプリを最初に開いたときに、次のようなコードを実行します。

  1. デフォルト/キーチェーンのデータをチェックします
  2. 見つかった場合、有料コンテンツを有効にする/広告を無効にする
  3. そのデータを新しいキーに移行します(したがって、再度アップグレードしたり、無料のものを配布したりしないでください)
1
Wain