web-dev-qa-db-ja.com

自動更新可能なサブスクリプションがまだ有効かどうかを確認します

アプリを開くたびに、自動更新可能なサブスクリプションのステータスを確認したいと思います。

これは、ユーザーがまだサービスにサブスクライブしていることを確認するためです。どうすればこれを達成できますか?

何かご意見は?ありがとうございました

追伸:私はSwiftyStoreKitを使用しています

15
JayVDiyk

サブスクリプションにユーザーが付与されているかどうかを確認するために、レシート検証を行ういくつかの方法があります。これを正しく行う2つの方法を次に示します。

  1. here と書かれているように、レシート検証をローカルで実行します。
  2. here と書かれているので、リモートで受信確認を行います。領収書は、App Storeにアプリを送信してはいけないということです。短い要約:

    • アプリはレシートをバックエンドに送信します。
    • バックエンドはレシートをAppleバックエンドの検証のために送信します。
    • バックエンドはAppleから応答を受け取ります。
    • バックエンドは、レシートの有効または無効な結果をアプリに送り返します。

両方の方法で、アプリ内購入のリストを取得します。期限切れのサブスクリプションも含まれます。すべてのサブスクリプションを確認し、有効期限を確認する必要があります。それでも有効な場合は、ユーザーにサブスクリプションを付与する必要があります。

私が理解しているように、あなたはSwiftyStoreKitを使用しており、ここに ローカルレシート検証 のオープンタスクがあります。

7
Ramis

この機能で確認できます。 Swift4で動作します

func receiptValidation() {
let SUBSCRIPTION_SECRET = "yourpasswordift"
let receiptPath = Bundle.main.appStoreReceiptURL?.path
if FileManager.default.fileExists(atPath: receiptPath!){
    var receiptData:NSData?
    do{
        receiptData = try NSData(contentsOf: Bundle.main.appStoreReceiptURL!, options: NSData.ReadingOptions.alwaysMapped)
    }
    catch{
        print("ERROR: " + error.localizedDescription)
    }
    //let receiptString = receiptData?.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
    let base64encodedReceipt = receiptData?.base64EncodedString(options: NSData.Base64EncodingOptions.endLineWithCarriageReturn)

    print(base64encodedReceipt!)


    let requestDictionary = ["receipt-data":base64encodedReceipt!,"password":SUBSCRIPTION_SECRET]

    guard JSONSerialization.isValidJSONObject(requestDictionary) else {  print("requestDictionary is not valid JSON");  return }
    do {
        let requestData = try JSONSerialization.data(withJSONObject: requestDictionary)
        let validationURLString = "https://sandbox.iTunes.Apple.com/verifyReceipt"  // this works but as noted above it's best to use your own trusted server
        guard let validationURL = URL(string: validationURLString) else { print("the validation url could not be created, unlikely error"); return }
        let session = URLSession(configuration: URLSessionConfiguration.default)
        var request = URLRequest(url: validationURL)
        request.httpMethod = "POST"
        request.cachePolicy = URLRequest.CachePolicy.reloadIgnoringCacheData
        let task = session.uploadTask(with: request, from: requestData) { (data, response, error) in
            if let data = data , error == nil {
                do {
                    let appReceiptJSON = try JSONSerialization.jsonObject(with: data)
                    print("success. here is the json representation of the app receipt: \(appReceiptJSON)")
                    // if you are using your server this will be a json representation of whatever your server provided
                } catch let error as NSError {
                    print("json serialization failed with error: \(error)")
                }
            } else {
                print("the upload task returned an error: \(error)")
            }
        }
        task.resume()
    } catch let error as NSError {
        print("json serialization failed with error: \(error)")
    }



}
}
6
Yasin Aktimur

この質問にまだつまずく人のために RevenueCat SDK を使用する代替ソリューションを提供したかったのです。

AppDelegate.Swift

RevenueCatPurchases SDKを、APIキーとオプションのユーザー識別子で構成します。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    Purchases.configure(withAPIKey: "<...>", appUserID: "<...>")

    ...

    return true
}

サブスクリプションステータス関数

以下の関数は、PurchaserInfoをチェックして、ユーザーがまだアクティブな「資格」を持っているかどうかを確認します(またはアクティブな製品IDを直接確認できます)。

func subscriptionStatus(completion: @escaping (Bool)-> Void) {
    Purchases.shared.purchaserInfo { (info, error) in

        // Check if the purchaserInfo contains the pro feature ID you configured
        completion(info?.activeEntitlements.contains("pro_feature_ID") ?? false)

        // Alternatively, you can directly check if there is a specific product ID
        // that is active.
        // completion(info?.activeSubscriptions.contains("product_ID") ?? false)
    }
}

サブスクリプションステータスの取得

上記の関数は必要に応じて何度でも呼び出すことができます。結果はPurchases SDKによってキャッシュされるため、ほとんどの場合同期的に返され、ネットワーク要求は不要です。

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    subscriptionStatus { (subscribed) in
        if subscribed {
            // Show that great pro content
        }
    }
}

SwiftyStoreKitを使用している場合、RevenueCat構文はかなり似ており、切り替えを支援する 移行ガイド が利用可能です。

2
enc_life