Ios PKPaymentAuthorizationController不调用委托方法并在“时冻结”;取消“;受压

Ios PKPaymentAuthorizationController不调用委托方法并在“时冻结”;取消“;受压,ios,swift,applepay,siri,sirikit,Ios,Swift,Applepay,Siri,Sirikit,在我的意图扩展中,我使用PKPaymentAuthorizationController允许用户付款。我在它周围创建了一个包装,如下所示: class ApplePayModalController: NSObject { public typealias AuthorizationHandler = (ApplePayModalController, PKPayment, (PKPaymentAuthorizationResult) -> Void) -> Void p

在我的意图扩展中,我使用
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
  }
但是,当我介绍控制器时,我遇到以下问题:

  • 按下“取消”按钮会导致整个控制器停止工作。我无法更改付款方式,它不会关闭,“付款”按钮也停止响应。但是,我仍然可以点击控制器的外部来关闭它

  • 委托方法根本没有启动。我尝试添加更多的委托方法,但这些方法也没有启动;因此,我无法处理付款授权

  • 当我尝试使用不同的卡付款时,控制器的行为不一致。使用苹果美国运通测试卡,尝试支付将立即失败;使用苹果测试签证,它会在“处理”过程中停滞15-20秒,然后显示一条警告,上面写着“苹果支付未完成”()


  • 这一切都是在iPhone X、iOS 12.1.4上运行的,在沙箱模式下使用Apple Pay。

    确保您的
    ApplePayModalController
    实例生命周期长于您的支付过程。尝试使用静态
    ApplePayModalController
    singleton。

    确保您的
    ApplePayModalController
    实例生命周期长于您的支付流程。尝试使用静态
    ApplePayModalController
    singleton。

    你明白了吗?你明白了吗?