- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
SKPaymentTransactionObserver.paymentQueue:updatedTransactions 返回一组交易。当我付款时,我如何知道我付款的是哪笔交易?当我付款时,它总是返回一笔交易吗?
同时,这个观察者函数在恢复交易时也会被调用。那么,处理 updatedTransactions 的最佳实践是什么?
顺便说一句,我的订阅产品是自动续订订阅。
最佳答案
迭代交易循环并检查每笔交易。
public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch (transaction.transactionState) {
case .purchased:
completeTransaction(transaction: transaction)
break
case .failed:
failedTransaction(transaction: transaction)
break
case .restored:
restoreTransaction(transaction: transaction)
break
case .deferred:
// TODO show user that is waiting for approval
break
case .purchasing:
break
}
}
}
private func completeTransaction(transaction: SKPaymentTransaction) {
print("completeTransaction...")
deliverPurchaseForIdentifier(identifier: transaction.payment.productIdentifier)
SKPaymentQueue.default().finishTransaction(transaction)
}
private func restoreTransaction(transaction: SKPaymentTransaction) {
guard let productIdentifier = transaction.original?.payment.productIdentifier else { return }
print("restoreTransaction... \(productIdentifier)")
deliverPurchaseForIdentifier(identifier: productIdentifier)
SKPaymentQueue.default().finishTransaction(transaction)
}
private func failedTransaction(transaction: SKPaymentTransaction) {
if let error = transaction.error as NSError? {
if error.domain == SKErrorDomain {
// handle all possible errors
switch (error.code) {
case SKError.unknown.rawValue:
print("Unknown error")
BaseViewController.currentViewController?.Alert(title: MFErrors.purchaseFaild.messgae.title, msg: MFErrors.purchaseFaild.messgae.body)
case SKError.clientInvalid.rawValue:
print("client is not allowed to issue the request")
BaseViewController.currentViewController?.Alert(title: MFErrors.accountNotAllowedToMakePurchase.messgae.title, msg: MFErrors.accountNotAllowedToMakePurchase.messgae.body)
case SKError.paymentCancelled.rawValue:
print("user cancelled the request")
case SKError.paymentInvalid.rawValue:
print("purchase identifier was invalid")
case SKError.paymentNotAllowed.rawValue:
print("this device is not allowed to make the payment")
BaseViewController.currentViewController?.Alert(title: MFErrors.purchaseFaild.messgae.title, msg: MFErrors.purchaseFaild.messgae.body)
default:
break;
}
}
ProgressViewManager.shared.hide()
}
SKPaymentQueue.default().finishTransaction(transaction)
}
private func deliverPurchaseForIdentifier(identifier: String?) {
guard let identifier = identifier else { return }
//Check if this transactions is a subscription
//SubscriptionsProductIdentifiers is an array of subscriptions product ids you sent to the app store to get SKProducts
//If subscription
if SubscriptionsProductIdentifiers.contains(identifier) {
}else{
//If non-consumable, consumables etc...
}
}
这是我之前回答中完整的商店经理: How to handle shouldAddStorePayment for In-App Purchases in iOS 11?
关于iOS IAP paymentQueue :updatedTransactions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47388711/
当我的服务器通过我的应用程序和 Google Play 服务器响应购买产品 ID 时,将 IAP 项目发送到设备(客户端),它在哪里保存/存储该项目(文件)。 后续问题 - 我可以控制它们的存储位置吗
我在 App Store 中有我的应用程序,目前是付费版本,但我正在免费提供它并带来 IAP,这可以解锁他们以前拥有的一些功能。例如,免费用户只能添加10个条目,但IAP用户在我开发的这个版本中可以添
我的主屏幕上显示了带有 Logo 的图片集。 如果用户在购买 IAP 后喜欢某张照片,我希望用户从特定图片中删除 Logo 。但是苹果希望我使用非消耗性模型一次性从所有图片中删除 Logo 。但那不是
我有一个应用程序,我只想使用 google pay 进行 1 次非消耗性升级,我使用下面的代码来获取我的 google play 购买状态 override fun onPurchasesUpdate
我想重命名在 iTunes 上注册的 IAP 项目。 我需要升级我的游戏,所以我更改了 IAP 项目的显示名称。 但是当我购买时,购买弹出文本没有改变。 我在 iTunes 上正确更改了它的名称。 但
我正在尝试通过 iTunes Connect(管理员访问)在我的 iOS 应用程序中添加 IAP。引用随附的屏幕截图,我可以查看共享 key ,但在可用的 IAP 选项下没有列出自动续订订阅。我确实检
我有一个名为“专业版”的非消耗性 IAP。我给买家一些额外的积分和一些访问权限。 他们第一次购买时没有问题。它给出了分数并消除了限制。 但是当他们再次尝试购买时,它会说“您已经购买了这个项目,点击确定
在我的应用中,我购买了 3 项消费品,当我购买一项时,我会收到包含 4 项购买的 IAP 收据:一项是我刚刚购买的,另外一项是我不久前购买的。 3 旧购买总是相同。看起来从未对它们调用 finishT
我如何知道购买日期和到期日期之间自动续订订阅的持续时间。 例如,如果用户在 1 月 31 日通过自动续订购买了 1 个月的产品,那么到期日是什么时候? (2 月 28 日?……如果是闰年?) 谢谢。
我正在使用非消耗型 IAP 并尝试让恢复按钮正常工作。 我注意到,当用户尝试购买他们已经购买过的东西时,会出现一个 Apple 提醒,提示“您已经购买了这个。您想免费再次购买吗?” 所以我想知道如何为
我正在为我的应用中的店面编写自定义 UIView。大多数教程展示了某种 UITableView,用于显示 Apple 应用内购买的结果。 我没有使用表格来显示我的购买按钮,而是布置了一个我希望按钮显示
我的 iOS 应用程序需要登录到我们的服务器并购买非消耗品。我做了一些研究。 我的问题是,如果我更改另一个帐户登录到服务器并仍然使用 B Apple id,我登录我们的服务器以使用 B Apple i
我的应用程序有单独的非消耗性应用程序内购买项目,外加一个“批量”IAP,其中包含所有其他 IAP 的折扣价。因此,在允许用户购买 IAP 之前,我需要知道他们已经购买了哪些其他 IAP。我知道获取此信
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关于您编写的代码问题的问题必须在问题本身中描述具体问题 — 并且包括有效代码 以重现它。参见 SS
在测试我的 IAP 商店实现时 [沙箱]。我购买了一件商品,我收到了确认 [取消/购买] 的购买提醒。但是元素的价格是错误的。有一种特定的方法可以重现它。 1] 点击商店中显示的商品。等待购买确认提醒
我们目前正在开发一款应用程序内购买 - Apple 托管内容,该应用程序运行良好,用户可以购买内容并且应用程序可以正常下载。 但是我们已经开始在应用程序中开发恢复购买按钮,我们似乎无法弄清楚如何使用
希望这是一个简单的问题: 我有一个经过批准的 iOS 应用程序,可以在应用程序内购买,我正在尝试更新一个新版本。我能否将 iTunes Connect 提交流程的应用内购买部分留空,并假设新版本将引用
我的新 App 启动 10 小时后无法使用 InApp 购买,其他人是否遇到过同样的问题? 通过 Apple 服务器传播需要多长时间? 谢谢 最佳答案 应用内购买现已在 App Store 上可用,批
我正在开发一个系统,用户(应用程序的所有者)将能够动态添加 iAps,而无需重新提交更新。Google Play(Android)不会产生任何问题,但因为我正在盯着 iO做同样的事情我遇到了几个问题。
如果用户在上线应用程序中购买了非消耗性 IAP,如果该用户被设置为 iTunesConnect 用户和测试者,他是否在沙盒环境中拥有 IAP?然后该用户可以通过 restoreCompletedTra
我是一名优秀的程序员,十分优秀!