2016-06-01 5 views
1

私は自動再生可能な購読について多くの読書をしましたが、ユーザーにアクティブな購読があるかどうかをチェックする方法に問題があります。これは私が領収書ユーザーがアクティブなサブスクリプションを持っているかどうかの標準チェック(自動更新可能なサブスクリプション)。 IOS Swift

func validateRecipt(callback:(receipt:NSDictionary?)->()){ 
     let recuptUrl = NSBundle.mainBundle().appStoreReceiptURL 
     if let receipt: NSData = NSData(contentsOfURL:recuptUrl!) { 

      //https://sandbox.itunes.apple.com/verifyReceipt //TEST ENVIRONMENT 
      //https://buy.itunes.apple.com/verifyReceipt  //PRODUCTION ENVIRONMENT 
      let request = NSMutableURLRequest(URL: NSURL(string: "https://sandbox.itunes.apple.com/verifyReceipt")!, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 10) 

      let session = NSURLSession.sharedSession() 
      request.HTTPMethod = "POST" 
      let receiptdata:NSString = receipt.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) 
      let payload:NSDictionary = {["receipt-data" : receiptdata, "password" : "mySharedKey"]}() 
      //, password\" : \"" + EGConstants.sharedSecret + "\" }" 

      do { 

      let payloadData:NSData = try(NSJSONSerialization.dataWithJSONObject(payload, options: NSJSONWritingOptions(rawValue: 0))) 

      request.HTTPBody = payloadData 
      let task = session.dataTaskWithRequest(request) { (data, response, err) in 

       do { 
        let json = try(NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as? NSDictionary) 

        if(err != nil) { 
         print(err!.localizedDescription) 
         let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding) 
         print("Error could not parse JSON: '\(jsonStr)'") 
         callback(receipt: nil) 
        } 
        else { 
         if let parseJSON = json { 


          callback(receipt: parseJSON) 
         } 
         else { 
          let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding) 
          print("Recipt Error: \(jsonStr)") 
          callback(receipt: nil) 
         } 
        } 
       } catch { 

       } 
      } 



      task.resume() 

      } catch {} 
     } 
    } 

を取得する方法である

私の質問は以下のとおりです。

1.ユーザーは、領収書を使用して、アクティブなサブスクリプションを持っているかどうかを確認する方法は? (私は領収書を解析し、product subscriptionの最後のトランザクションの最後expires_dateを取得する必要があるのですか?)

2.それは細かいレシート私はアプリを起動するたびにリフレッシュしますか?(ユーザーは自分のサブスクリプションをキャンセルした場合、私がチェックできるように、 )いつリフレッシュレシートをする必要がありますか?

ps。間違ったコンセプトや質問があれば、私を正しい道に導いてください。事前に感謝します

+0

、これはあなたの質問に答えていませんが、私はあなたにリクエストを送信することにより、ローカルの領収書の検証をしない必要があることに言及したいと思いますitunes。この検証は、あなたのコントロール下にある唯一の側としてサーバーによって実行される必要があります。 [App Storeでの受領証の検証](https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SW1)を参照してください。 –

+0

@EugeneDubininサーバーは私のアプリの外にあるのですか?ウェブサーバーのような? – CaffeineShots

+0

はい。あなたが 'Base64'レシートデータを送信して、iTunesを使ってサーバが行う検証結果を受け取ることができるサーバー。 –

答えて

0

おそらく、それは答えが遅すぎますが、最後に、私は同様の問題に取り組んできました。しかし、あなたは余分なhttp呼び出しを行う必要はないので、領収書をローカルで構文解析して検証する必要がありました。

私は、小さなライブラリを実装して、In-App Receiptをローカルで簡単に処理できるようにしました。

気軽にご利用ください。ここで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) 
} 
+0

このコードを試しましたが何も起こりません。使用されていないという警告が2つあります – BroSimple

+0

@BroSimpleライブラリが更新されていて、GitHubページの例があります – tikhop

+0

私の例は表示されません。私はTPInAppReceiptでこのjsonを検証することはできません – BroSimple