2011-02-25 11 views
18

In App購入を使用して新しいAuto Renewable購読を実装しようとしていますが、現在購読しているかどうかをいつどのように確認するかはわかりません。私の理解では、ユーザーが最初に購読したときに、アプリは契約日と一緒に購入日を使用して、契約の存続期間を計算することができます。この日が過ぎるとどうなりますか?ユーザーが自動更新またはキャンセルしたかどうかを確認するにはどうすればよいですか?チェックインの方法App Purchase Purchase Auto Renewable Subscriptionが有効です

restoreCompletedTransactionsを使用して、更新ごとに領収書を受け取ると、ユーザーはiTunesパスワードの入力を求められます。これは、7日間の定期購入を購入した場合、アプリがサブスクリプションがまだ有効かどうかをチェックすると、7日ごとにパスワードを入力する必要があることを意味しますか?

+0

このリンクhttps://stackoverflow.com/questions/22680059/auto-renewable-subscription-in-ios7/45220204#45220204 が役立つかもしれません君は。 –

答えて

7

ドキュメントのためにこれを参照してください:あなたは、ウェブサーバからそれを確認したい場合は、あなたが彼らのAPIをping

http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/VerifyingStoreReceipts/VerifyingStoreReceipts.html#//apple_ref/doc/uid/TP40008267-CH104-SW1

、それが最後の程度の自動再生可能なサブスクリプションおよび情報のステータスを返します支払い。

あなたがデバイスを使用している場合は、パスワードを尋ねるrestoreCompletedTransactionsを呼び出す必要があります。

他の方法はありません。あなたは、サーバー側で使用されているのと同じWebサービスに連絡して、サブスクリプションを確認できると思いますか?私はその賛否両論がどういうものか分かりません。

+1

領収書の有効性チェックを行う際にAppleのサーバーへの呼び出しで共有秘密をパラメータとして指定する必要があるため、サーバーコンポーネントを使用する必要があります。私は、あなたのiOSアプリクライアントコードに共有秘密を置くことになっているとは思わない。なぜなら秘密はそれほど秘密ではないからだ... – Jonny

+0

サンドボックスとプロダクションの両方の領収書を検証するためには、オートリニューアルサブスクリプションのモード? @Jonny –

+0

こんにちは、あなたは "APIにpingをして、自動更新可能なサブスクリプションのステータスと最後の支払いについての情報を返す"と言っています。サーバーサイドでステータスをチェックするAPIは何ですか? – Yohan

3

私はこの問題を回避するキャンペーンを開始しています。

自動更新されると、App StoreはpaymentQueueを呼び出し、トランザクションを通知します。取引はtransaction.transactionState==SKPaymentTransactionStateRestoredで転記されます。

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

(存在しない)- [[SKPaymentQueue defaultQueue] restoreAttachedTransactions:(NSArray *)transactions];

をこのコマンドはちょうどrestoreCompletedTransactionsのように流れるだろうが、それが唯一の添付トランザクションを復元し、ほとんどのでしょう:だから、私の質問は、なぜStoreKitコマンドを持っていない...です重要なことに、ユーザーによるログインは必要ありません。これは、 "httpが最後のトランザクションを含む64ビットのエンコードされたJSONをポストする"と同じセキュリティ保護を持ち、Webポスティングコードを要求するのではなく、In App Purchaseプロセス全体をStoreKitで実行できるようにします。

これが意味をなさない場合は、Appleにこれを伝える方法を提案してください....ありがとう。

+0

あなたが説明した内容は、私が次のプレイで見つけたものと一致するようですので、サーバーコンポーネントを実装することに決めました。余分なコーディングが必要なので苦労しますが、サーバーコンポーネントは非常にシンプルで、監査証跡と領収書の検証にはおそらく価値があります。 –

12

今日、私はこの問題に問題があります。

ここではApple docに従います。この方法でサブスクリプションの有効期限が切れているかどうかを確認しました。私のアイデア:ユーザー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; 
    } 
} 

希望します。

+1

ありがとうございます。推奨サプリメント:NSURLSessionチュートリアルで、非同期チェックを行うことができます(https://www.raywenderlich.com/110458/nsurlsession-tutorial-getting-started)。サンドボックス購読のテスト方法については、https:// savvyappsを参照してください。 .com/blog/how-setup-test-auto-renewable-subscription-ios-app – Philosophistry

4

アップルAPIを呼び出す前に、ローカルソリューションを使用する方がよい。アプリが実行されるたびにローカルの領収書を検証することをお勧めします。また、ユーザーにアクティブな定期購読があるかどうかを確認する必要がある場合は、まずローカル領収書から購入を取得して、 。

私はSwiftで書かれた小さなライブラリを実装して、In-App Receiptをローカルで簡単に操作できるようにしました。領収書を表すオブジェクトを簡単に取得し(InAppReceipt)、アクティブな購入/すべての購入を取得することができます。

気軽にご利用ください。ここでGithub link

はあなたの問題を解決するための例です:

import TPInAppReceipt 

do { 
    let receipt = try InAppReceiptManager.shared.receipt() 

    //retrive active auto renewable subscription for a specific product and date 
    let purchase = receipt.activeAutoRenewableSubscriptionPurchases(ofProductIdentifier: "ProductName", forDate: Date()) 

    //retrive all auto renewable subscription purchases for a specific product 
    let allAutoRenewableSubscriptionPurchases = receipt.purchases(ofProductIdentifier: "productName").filter({ return $0.isRenewableSubscription }) 
} catch { 
    print(error) 
} 
関連する問題