IAP autoRenewable 订阅,SKPaymentQueue 更新交易功能没有响应

IAP autoRenewable subscriptions, SKPaymentQueue update transaction function is not responding

我已经在我的应用程序中实现了自动续订订阅的应用程序购买,但我正在尝试在购买完成后实现一些东西。

下面是我的 IAP 订阅服务

class SubscriptionService: NSObject {


static let sessionIdSetNotification = Notification.Name("SubscriptionServiceSessionIdSetNotification")
static let optionsLoadedNotification = Notification.Name("SubscriptionServiceOptionsLoadedNotification")
static let restoreSuccessfulNotification = Notification.Name("SubscriptionServiceRestoreSuccessfulNotification")
static let purchaseSuccessfulNotification = Notification.Name("SubscriptionServiceRestoreSuccessfulNotification")

static let shared = SubscriptionService()

private var purchasedProductIdentifiers: Set<ProductIdentifier> = []

var productDidPurchased: (() -> Void)?

var hasReceiptData: Bool {
    return loadReceipt() != nil
}

var options: [Subscription]? {
    didSet {
        NotificationCenter.default.post(name: SubscriptionService.optionsLoadedNotification, object: options)
    }
}

func loadSubscriptionOptions() {

    let products: Set = ["productIDS"]

    let request = SKProductsRequest(productIdentifiers: products)
    request.delegate = self
    request.start()
}

func uploadReceipt(completion: ((_ success: Bool) -> Void)? = nil) {
    if let receiptData = loadReceipt() {

    }
}

private func loadReceipt() -> Data? {
    guard let url = Bundle.main.appStoreReceiptURL else {
        return nil
    }

    do {
        let data = try Data(contentsOf: url)
        return data
    } catch {
        print("Error loading receipt data: \(error.localizedDescription)")
        return nil
    }
}

func purchase(subscription: Subscription) {
    let payment = SKPayment(product: subscription.product)
    print("Product being bought: \(payment)")
    SKPaymentQueue.default().add(payment)
}

func restorePurchases() {
    SKPaymentQueue.default().restoreCompletedTransactions()
}
 }

 extension SubscriptionService: SKProductsRequestDelegate {
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
    options = response.products.map { Subscription(product: [=10=]) }
    print("in here 1")
    print(options!)
   // let purchased = UserDefaults.standard.bool(forKey: "com.mylawnow.sub.allaccess")
    //print("Purchased\(purchased)")
    print("in here 2")
}

func request(_ request: SKRequest, didFailWithError error: Error) {
    if request is SKProductsRequest {
        print("Subscription Options Failed Loading: \(error.localizedDescription)")
    }
}
}

//---------------------------------------- ------------------

这部分似乎不起作用。 None 个函数似乎在触发(我已经实现了打印语句以查看它们是否被触发,但它们似乎没有。)

extension SubscriptionService: SKPaymentTransactionObserver{

public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    print("updating")
    for transaction in transactions {
        switch (transaction.transactionState) {
        case .purchased:
            print("purchased made")
            complete(transaction: transaction)
            break
        case .failed:
            print("purchased failed")
            fail(transaction: transaction)
            break
        case .restored:
            print("restored")
            restore(transaction: transaction)
            break
        case .deferred:
            print("purchase deferred")
            break
        case .purchasing:
            print("purchase being made")
            break
        }
    }
}

我假设一旦购买完成,应该使用完整的功能来执行某些功能。

private func complete(transaction: SKPaymentTransaction) {
    print("completed...")
    deliverPurchaseNotificationFor(identifier: transaction.payment.productIdentifier)
    SKPaymentQueue.default().finishTransaction(transaction)
}

private func restore(transaction: SKPaymentTransaction) {
    guard let productIdentifier = transaction.original?.payment.productIdentifier else { return }

    deliverPurchaseNotificationFor(identifier: productIdentifier)
    print("identifier: \(productIdentifier)")
    SKPaymentQueue.default().finishTransaction(transaction)
}

private func fail(transaction: SKPaymentTransaction) {
    print("failed...")
    if let transactionError = transaction.error as NSError?,
        let localizedDescription = transaction.error?.localizedDescription,
        transactionError.code != SKError.paymentCancelled.rawValue {
        print("Transaction Error: \(localizedDescription)")
    }

    SKPaymentQueue.default().finishTransaction(transaction)
}

private func deliverPurchaseNotificationFor(identifier: String?) {
    guard let identifier = identifier else { return }

   purchasedProductIdentifiers.insert(identifier)
   UserDefaults.standard.set(true, forKey: identifier)
   NotificationCenter.default.post(name: .IAPHelperPurchaseNotification, object: identifier)
}

}

所以我发现了错误。在我的 loadSubscriptions 函数中,我需要将观察者应用到 SKPaymentQueue。所以它应该像下面这样:

func loadSubscriptionOptions() {
    let products: Set = ["productIDS"]

    let request = SKProductsRequest(productIdentifiers: products)
    request.delegate = self
    request.start()
     SKPaymentQueue.default().add(self) //--> this line is needed
}