web-dev-qa-db-ja.com

iOS:ユーザーが自動更新可能なサブスクリプションにサブスクライブしているかどうかを検出する方法

タイトルが自明であることを願っています。私はこのようなことをしようとしています:

checkIfUserIsSubscribedToProduct(productID, transactionID: "some-unique-transaction-string", completion: { error, status in
    if error == nil {
        if status ==  .Subscribed {
            // do something fun
        }
    }
 }

私が提供した仮想コードのようなものは存在しますか?クレイジーピルを服用しているように感じます

編集

同様の質問で、「レシートを検証する必要があります」という一般的な回答が表示され続けますが、レシートがどのように、または何であるかについての説明もありません。誰かが「領収書を検証する」方法を教えてもらえますか? このチュートリアル を試しましたが、うまくいかないようです。

編集-バウンティ用

次の状況に対処してください。ユーザーが自動更新可能なサブスクリプションにサブスクライブし、そのためにより多くのデジタルコンテンツを取得する-クールで実装済み。しかし、アプリを開くたびに、そのサブスクリプションがまだ有効である(つまり、サブスクリプションをキャンセルしなかった)かどうかを確認するにはどうすればよいですか? これを確認する最も簡単な解決策は何ですか?私の質問で提供した仮想コードのようなものはありますか?これについて説明し、役立つ可能性のある主題に関する詳細を入力してください。

32
rigdonmr

誰もが私と私がこれについてどのようにやっているのかを非常に心配していたことを知っています-恐れないで、私の問題を解決しました。主な問題は、私が このリンクのゴミと古くなったコード を試したことですが、機能していなかったため、あきらめました。それから私はそれに戻り、Alamofireで実装しました。コードソリューションは次のとおりです。

Swift 3:

let receiptURL = Bundle.main.appStoreReceiptURL
let receipt = NSData(contentsOf: receiptURL!)
let requestContents: [String: Any] = [
    "receipt-data": receipt!.base64EncodedString(options: []),
    "password": "your iTunes Connect shared secret"
]

let appleServer = receiptURL?.lastPathComponent == "sandboxReceipt" ? "sandbox" : "buy"

let stringURL = "https://\(appleServer).iTunes.Apple.com/verifyReceipt"

print("Loading user receipt: \(stringURL)...")

Alamofire.request(stringURL, method: .post, parameters: requestContents, encoding: JSONEncoding.default)
    .responseJSON { response in
        if let value = response.result.value as? NSDictionary {
            print(value)
        } else {
            print("Receiving receipt from App Store failed: \(response.result)")
        }
}
24
rigdonmr

特に何を達成しようとしていますか?特定のApple IDを確認しますか?

これがSDKを介して可能であることを非常に疑います。 ユーザーのApple IDを取得できますか? を参照すると、IDを直接要求することもできず、それ。

動作するのは、すべてのトランザクションを自分のサーバーにキャッシュし、そのデータベースをローカルで検索することですが、アプリがユーザーのApple IDを要求するため、アプリが起動するたびにサブスクリプションの状態を更新できるようになりますデバイスに関連付けられているIDのIAPを確認できます。

ただし、ユーザーは自分が望むものを何でも入力することができます-Appleのアプリレビュープロセスでこれを取得することはほとんどありません。

1
user2875404

私はMKSoreKitを使用しています https://github.com/MugunthKumar/MKStoreKit サブスクリプションの自動更新に使用しますが、Objective Cではソリューションのライブラリコードを確認できます。コードで使用していますそしてそれはうまく機能しています。

以下の方法を使用すると、サブスクリプションのステータスを簡単に確認できます。

if([MKStoreManager isProductPurchased:productIdentifier]) {
 //unlock it
}

デバイスからApple idを取得します。これはユーザー固有のものだと思います

1
Rishabh

いくつかのコメントが指摘したように、これらの回答にはいくつかの欠陥があります。

  1. クライアントから/verifyReceiptを呼び出すことは安全ではありません。
  2. 有効期限をデバイスの時計と比較することは、時刻を変更することで偽装できます(無料トライアルをキャンセルした後は、常に楽しいハックを試してみてください:))

受信確認を処理するためにサーバーをセットアップする方法に関する他のチュートリアルがいくつかありますが、これは問題の一部にすぎません。アプリを起動するたびに開封して領収書を検証するネットワークリクエストを行うと問題が発生する可能性があるため、スムーズに実行するにはキャッシュも必要です。

RevenueCat SDK は、このためのすぐに使える優れたソリューションを提供します。

このアプローチが好きな理由はいくつかあります:

  • 受信サーバー側を検証します(サーバーをセットアップする必要はありません)
  • サーバーのタイムスタンプを使用して「アクティブな」サブスクリプションをチェックし、デバイスのクロックを変更してもスプーフィングされないようにします
  • 結果をキャッシュして、超高速でオフラインで動作するようにします

この質問にはさらに詳細があります: https://stackoverflow.com/a/55404121/3166209

それが機能するのは、必要に応じて何度でも呼び出すことができ、ほとんどの場合に同期的に返される単純な関数です(キャッシュされているため)。

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