【问题标题】:Storekit and handling users who have already purchased IAPsStorekit 和处理已购买 IAP 的用户
【发布时间】:2018-05-25 14:40:32
【问题描述】:

我在关注this RW 教程,和很多IAP 和Storekit 教程一样,他们第一次谈论用户购买IAP 的流程,但他们没有详细说明如何当已购买 IAP 的用户再次打开该应用时,该应用运行。

当我找到问题的关键时更新我的​​问题:

据我所知,阻止/显示内容的代码是查找 (1) 收据和 (2) SessionID ...他在教程中没有详细说明 SessionID 是什么对于或是否仅作为本教程演示的一部分。例如,它仅在调用 uploadReceipt 时设置(仅在调用 handlePurchasedStatehandleRestoredState 时调用)。换句话说,如果用户打开已经订阅的应用程序,则没有运行代码来设置SessionID,因此内容永远不会解锁?

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  var window: UIWindow?

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

    SKPaymentQueue.default().add(self)
    SubscriptionService.shared.loadSubscriptionOptions()
    return true
  }  
}


// MARK: - SKPaymentTransactionObserver

extension AppDelegate: SKPaymentTransactionObserver {

  func paymentQueue(_ queue: SKPaymentQueue,
                    updatedTransactions transactions: [SKPaymentTransaction]) {

    for transaction in transactions {
      switch transaction.transactionState {
      case .purchasing:
        handlePurchasingState(for: transaction, in: queue)
      case .purchased:
        handlePurchasedState(for: transaction, in: queue)
      case .restored:
        handleRestoredState(for: transaction, in: queue)
      case .failed:
        handleFailedState(for: transaction, in: queue)
      case .deferred:
        handleDeferredState(for: transaction, in: queue)
      }
    }
  }

  func handlePurchasingState(for transaction: SKPaymentTransaction, in queue: SKPaymentQueue) {
    print("User is attempting to purchase product id: \(transaction.payment.productIdentifier)")
  }

  func handlePurchasedState(for transaction: SKPaymentTransaction, in queue: SKPaymentQueue) {
    print("User purchased product id: \(transaction.payment.productIdentifier)")

    queue.finishTransaction(transaction)
    SubscriptionService.shared.uploadReceipt { (success) in
      DispatchQueue.main.async {
        NotificationCenter.default.post(name: SubscriptionService.purchaseSuccessfulNotification, object: nil)
      }
    }
  }

  func handleRestoredState(for transaction: SKPaymentTransaction, in queue: SKPaymentQueue) {
    print("Purchase restored for product id: \(transaction.payment.productIdentifier)")
    queue.finishTransaction(transaction)
    SubscriptionService.shared.uploadReceipt { (success) in
      DispatchQueue.main.async {
        NotificationCenter.default.post(name: SubscriptionService.restoreSuccessfulNotification, object: nil)
      }
    }
  }

  func handleFailedState(for transaction: SKPaymentTransaction, in queue: SKPaymentQueue) {
    print("Purchase failed for product id: \(transaction.payment.productIdentifier)")
  }

  func handleDeferredState(for transaction: SKPaymentTransaction, in queue: SKPaymentQueue) {
    print("Purchase deferred for product id: \(transaction.payment.productIdentifier)")
  }
}

【问题讨论】:

    标签: ios swift in-app-purchase subscription storekit


    【解决方案1】:

    您不会在每次用户启动应用时收到购买通知,但从技术上讲,您可以在每次程序运行时验证应用收据并重新处理每个 IAP。这似乎效率低下。您的应用程序应该在购买时跟踪已购买的内容。

    如果该应用曾被删除并重新安装,或者如果用户将其安装在另一台设备上,您应该提供“恢复应用内购买”功能来刷新应用收据并进行验证。

    【讨论】:

    • 谢谢...正如我所说,虽然我专门使用订阅 IAP,所以我不仅需要知道它是否被购买,而且我需要知道它是否已过期.. .so 我想找出最好的方法?
    猜你喜欢
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 2015-02-18
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多