ios - PKPaymentAuthorizationController 不调用委托方法并在按下“取消”时冻结
问题描述
在我的 Intents 扩展中,我使用PKPaymentAuthorizationController
来允许用户付款。我围绕它创建了一个包装器,如下所示:
class ApplePayModalController: NSObject {
public typealias AuthorizationHandler = (ApplePayModalController, PKPayment, (PKPaymentAuthorizationResult) -> Void) -> Void
private var onAuthorize: AuthorizationHandler?
func present(paymentRequest: PKPaymentRequest, onAuthorize: @escaping AuthorizationHandler) {
let controller = PKPaymentAuthorizationController(paymentRequest: paymentRequest)
self.onAuthorize = onAuthorize
controller.delegate = self
controller.present()
}
}
extension ApplePayModalController: PKPaymentAuthorizationControllerDelegate {
func paymentAuthorizationControllerDidFinish(_ controller: PKPaymentAuthorizationController) {
controller.dismiss()
}
func paymentAuthorizationController(_ controller: PKPaymentAuthorizationController, didAuthorizePayment payment: PKPayment, handler completion: @escaping (PKPaymentAuthorizationResult) -> Void) {
guard let onAuthorize = self.onAuthorize else {
return completion(.init(status: .failure, errors: nil))
}
onAuthorize(self, payment, completion)
}
}
这就是我得到用来展示它的 PKPaymentRequest 的地方:
public func createPKRequest(order: Order) -> PKPaymentRequest {
let paymentRequest = Stripe.paymentRequest(withMerchantIdentifier: PaymentRepository.merchantIdentifier, country: "US", currency: "USD")
paymentRequest.paymentSummaryItems = [
PKPaymentSummaryItem(label: "HSCO", amount: 1.00),
PKPaymentSummaryItem(label: "Phil", amount: NSDecimalNumber(value: Double(order.price) / 100))
]
paymentRequest.shippingType = .storePickup
paymentRequest.requiredBillingContactFields = [PKContactField.postalAddress]
return paymentRequest
}
但是,当我展示控制器时,我遇到了以下问题:
按下“取消”按钮会导致整个控制器停止工作。我无法更改付款方式,它不会关闭,并且“付款”按钮也停止响应。但是,我仍然可以在控制器外部点击以将其关闭
委托方法根本没有触发。我尝试添加更多委托方法,但也没有触发;因此,我无法处理付款授权。
当我尝试用不同的卡支付时控制器的行为并不一致。使用 Apple Amex 测试卡,尝试付款将立即失败;使用 Apple 测试 Visa,它会卡在“处理”状态 15-20 秒,然后显示“Apple Pay 未完成”的警报(与这篇文章相同)
这一切都在 iPhone X、iOS 12.1.4 上运行,在沙盒模式下使用 Apple Pay。
解决方案
确保您的ApplePayModalController
实例生命周期长于您的付款流程。尝试使用静态ApplePayModalController
单例。
推荐阅读
- apache-spark - Spark查找日期分区列的最大值
- node.js - Node js抛出MongoError:在更新多个集合中的多个文档时无法使用已结束的会话
- python-3.x - 如何从另一个文件导入python中的类对象
- sql - 使用 MS SQL EXPRESS 在 SQLAlchemy 中建立具有多个主键的表之间的关系时出错
- phpmyadmin - 错误 - 错误缺少 mysqli 扩展。IIS Window 7 即使在 INI 设置之后
- javascript - Chrome 扩展程序未检测到脚本 ID
- flutter - 黑屏中间有圆圈
- python - 如何将来自不同线程的消息记录到不同的文件?
- c# - 生成 20 个随机数并在数组中搜索数字的 C# 程序(续)
- java - 在保留类型的同时将 JooQ 字段转换为不合格版本