4

自動更新サブスクリプションを使用してアプリに取り組んでいます。オプションは 1 つだけです。1 週間の無料トライアル付きの毎月の自動更新サブスクリプションです。また、「サブスクリプション ステータス URL」を使用して、サブスクリプション通知を受け取ります。

アプリ自体は、複数のユーザー間でタスクを共有できる「TO DO LIST」アプリケーションに似ています。したがって、サーバー上にデータを保持します。

ユーザーがアプリをロードするか、タスクを作成するたびに、 current_subscription_status パラメーターを使用してサーバーからデータが取得されます。たとえば、レシートの有効期限をサーバー上の現在の日付と照合するだけで、サーバー上でサブスクリプション ステータスの検証を行います。

現在iOS版のみですが、Android版も開発中です。また、ユーザーは、異なる Apple ID を持つ異なるデバイスで自分のアカウントにサインインできる必要があります。

問題は、実際の購入 (サブスクリプション) 通知を受け取らないことです。たとえば、ユーザーが [1 週間の無料試用を開始] ボタンをタップしてサブスクライブすると、通知が届きます (タイプ INITIAL_BUY)。この1週間の試用期間の後、「RENEWAL」のようなタイプの別の通知を受け取るはずでしたが、何も受け取りません。

Apple 開発者サポートに連絡しましたが、本当の助けは得られませんでした。Apple のドキュメントへのリンクを送信するだけです。次のメモを見つけた場所 (ここにリンクがあります):

「イベントを処理する際に最新の情報を取得するには、アプリは App Store で最新のレシートを確認する必要があります。」

したがって、これに基づいて、考えられるユース ケース シナリオについて質問があります。

ユーザーは iOS デバイスで毎月の自動更新サブスクリプションに登録します。たとえば、彼/彼女は自分の Apple iTunes アカウントに請求されたいと考えています。しかし、最初の購入後、彼/彼女はアプリを終了 (強制終了) し、iOS デバイスで開くことさえしなくなりました。ユーザーはアプリを Android デバイスにダウンロードし、Android でのみアプリを使用します。そのため、App Store はこのユーザーに毎月課金し、ユーザーが iOS デバイスでアプリを二度と開いていない場合でも、サブスクリプション ステータス通知をサーバーに送信することになっていました。そのため、iOS アプリでは「...最新の受信確認...」は発生しません。これはどのように実装できますか?

技術詳細:

SwiftyStoreKit を使用しています。これらは、アプリ内購入の実装の 2 つの部分です。

  1. AppDelegate には次のものがあります。

            // Auto-renewal complete transactions
        SwiftyStoreKit.completeTransactions(atomically: true) { purchases in
            for purchase in purchases {
                if purchase.transaction.transactionState == .purchased || purchase.transaction.transactionState == .restored {
                    if purchase.needsFinishTransaction {
                        // Deliver content from server, then:
                        SwiftyStoreKit.finishTransaction(purchase.transaction)
                    }
                }
            }
        }
    
  2. ユーザーが「無料試用開始ボタン」をタップしたときに呼び出されるサブスクライブ関数は次のとおりです。

    func subscribe(completion: @escaping (_ response:Bool, _ message: String?) -> Void) {
    
    SwiftyStoreKit.purchaseProduct(self.productId, atomically: true) { result in
    
        if case .success(let purchase) = result {
            if purchase.needsFinishTransaction {
                SwiftyStoreKit.finishTransaction(purchase.transaction)
            }
            let appleValidator = AppleReceiptValidator(service: self.env, sharedSecret: self.sharedSecret)
            SwiftyStoreKit.verifyReceipt(using: appleValidator) { result in
    
                if case .success(let receipt) = result {
                    let purchaseResult = SwiftyStoreKit.verifySubscription(
                        type: .autoRenewable,
                        productId: self.productId,
                        inReceipt: receipt)
                    switch purchaseResult {
                    case .purchased(let expiryDate, let receiptItems):
    
                        if let receiptItem = receiptItems.first {
                            // Send receipt to the server functionality
                            .............................
                        }
                        completion(true, nil)
                    case .expired(let expiryDate, let receiptItems):
                        completion(false, "Receipt has been expired")
                    case .notPurchased:
                        completion(false, "Purchase has not been processed")
                    }
                } else {
                    // receipt verification error
                    completion(false, "ERROR OCCURED")
                }
            }
        } else {
            // purchase error
            completion(false, "Canceled")
        }
    }}
    
4

0 に答える 0