36

アプリ内購入を使用して新しい自動更新サブスクリプションを実装しようとしていますが、ユーザーが現在サブスクライブしているかどうかを確認する方法や時期がわかりません。私の理解では、ユーザーが最初にサブスクライブするとき、アプリは購入日とサブスクリプション日を使用して、サブスクリプションの期間を計算できます。この日付が過ぎるとどうなりますか? ユーザーが自動更新またはキャンセルしたかどうかを確認するにはどうすればよいですか?

restoreCompletedTransactions更新ごとにトランザクションと領収書を取得するために使用すると、ユーザーは iTunes パスワードを入力するように求められます。これは、7 日間のサブスクリプションを購入した場合、アプリがサブスクリプションがまだ有効かどうかを確認するときに、7 日ごとにパスワードを入力する必要があるということですか?

4

5 に答える 5

19

今日、私はこの問題に悩まされています。

Apple doc here に従ってください。この方法を使用して、サブスクリプションの有効期限が切れているかどうかを確認しました。私の考え: ユーザー APPLE REST API 応答: (要求時間 + 期限切れ時間) 期限切れかどうかを確認する

+ (BOOL)checkInAppPurchaseStatus
{
    // Load the receipt from the app bundle.
    NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
    NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
    if (receipt) {
        BOOL sandbox = [[receiptURL lastPathComponent] isEqualToString:@"sandboxReceipt"];
        // Create the JSON object that describes the request
        NSError *error;
        NSDictionary *requestContents = @{
                                          @"receipt-data": [receipt base64EncodedStringWithOptions:0],@"password":@"SHARE_SECRET_CODE"
                                          };
        NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents
                                                              options:0
                                                                error:&error];

        if (requestData) {
            // Create a POST request with the receipt data.
            NSURL *storeURL = [NSURL URLWithString:@"https://buy.itunes.apple.com/verifyReceipt"];
            if (sandbox) {
                storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];
            }
            NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL];
            [storeRequest setHTTPMethod:@"POST"];
            [storeRequest setHTTPBody:requestData];

            BOOL rs = NO;
            //Can use sendAsynchronousRequest to request to Apple API, here I use sendSynchronousRequest
            NSError *error;
            NSURLResponse *response;
            NSData *resData = [NSURLConnection sendSynchronousRequest:storeRequest returningResponse:&response error:&error];
            if (error) {
                rs = NO;
            }
            else
            {
                NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:resData options:0 error:&error];
                if (!jsonResponse) {
                    rs = NO;
                }
                else
                {
                    NSLog(@"jsonResponse:%@", jsonResponse);

                    NSDictionary *dictLatestReceiptsInfo = jsonResponse[@"latest_receipt_info"];
                    long long int expirationDateMs = [[dictLatestReceiptsInfo valueForKeyPath:@"@max.expires_date_ms"] longLongValue];
                    long long requestDateMs = [jsonResponse[@"receipt"][@"request_date_ms"] longLongValue];
                    NSLog(@"%lld--%lld", expirationDateMs, requestDateMs);
                    rs = [[jsonResponse objectForKey:@"status"] integerValue] == 0 && (expirationDateMs > requestDateMs);
                }
            }
            return rs;
        }
        else
        {
            return NO;
        }
    }
    else
    {
        return NO;
    }
}

この助けを願っています。

于 2016-09-16T10:11:39.463 に答える
10

Web サーバーから確認したい場合は、API に ping を送信すると、自動更新サブスクリプションのステータスと最後の支払いに関する情報が返されます。リンク

デバイスを使用している場合は、おそらくrestoreCompletedTransactionsを呼び出す必要があり、パスワードを要求すると思います。

他の方法は見当たりません。サーバー側で使用されているのと同じ Web サービスに接続することで、デバイスからサブスクリプションを確認できると思いますか? その長所と短所がどうなるかわかりません。

于 2011-03-19T19:05:21.603 に答える
3

この問題についてキャンペーンを開始します。これが私の観察とキャンペーンです。

自動更新時に、App Store は を呼び出してpaymentQueueトランザクションを送信します。トランザクションは で転記されtransaction.transactionState==SKPaymentTransactionStateRestoredます。

問題は、残念ながらこれが 1 つのデバイスにしか投稿されないことです。2 番目のデバイスは投稿を取得しません。したがって、自動更新を検出するには、または自動更新の欠如を検出してデバイスの継続的なサブスクリプションを拒否するには、restoreCompletedTransaction「最後のトランザクションを含む 64 ビットでエンコードされた JSON を http で投稿する」を実行する必要があります。前者の場合、ユーザーはパスワードを入力する必要があります。あなたが上で指摘したように、それは邪魔です。後者の場合、多くの追加コーディングが必要です。だから、私の質問は...なぜStoreKitコマンドがないのですか:

(存在しません)- [[SKPaymentQueue defaultQueue] restoreAttachedTransactions:(NSArray *)transactions];

このコマンドは と同じように流れますrestoreCompletedTransactionsが、アタッチされたトランザクションを復元するだけであり、最も重要なこととして、ユーザーによるログインは必要ありません。これには、「最後のトランザクションを含む 64 ビットでエンコードされた JSON を http ポストする」と同じセキュリティ保護があり、StoreKitWeb ポスト コードを必要とするのではなく、アプリ内購入プロセス全体を実行できます。

これがあなたにとって理にかなっている場合は、これをアップルに届ける方法を提案してください....ありがとう。

于 2011-04-09T19:30:24.020 に答える