Я установил PKPaymentAuthorizationViewController с действительным PKPaymentRequest, вошел в учетную запись из Песочницы с действительной тестовой картой и адресом доставки . Я изменил регион на США, но ничего не изменилось. Приложение имеет все действующие сертификаты и права.
func getApplePayController(request: PKPaymentRequest) -> PKPaymentAuthorizationViewController? {
guard let vc = PKPaymentAuthorizationViewController(paymentRequest: request) else {
return nil
}
//Set ourselves as delegate to get callbacks on the transaction status
vc.delegate = self
//we keep a weak reference to the controller to be able to dismiss it if necessary
self.applePayViewController = vc//This is weak
return vc
}
И представить:
//Show Apple Pay screen with configured PKPaymentRequest object
guard let vc = getApplePayController(request: paymentRequest) else {
dLog("Error instantiating Apple Pay screen")
handleEventType(.status(.failed))
return
}
assert(delegate != nil)
assert(applePay.didAuthorize == false)
assert(vc.delegate != nil)
//disable swipe to dismiss
if #available(iOS 13.0, *) {
vc.isModalInPresentation = true
}
if var topController = UIApplication.shared.keyWindow?.rootViewController {
while let presentedViewController = topController.presentedViewController {
topController = presentedViewController
}
// topController should now be your topmost view controller
topController.present(vc, animated: true, completion: nil)
}
Появляется экран, если я нажимаю на кнопку Отмена все зависает. Если я нажимаю на фон, экран автоматически закрывается, но остальная часть представления не является интерактивной (PKPaymentAuthorizationViewController не закрывается, но его пользовательский интерфейс скрыт). Если я нажимаю «Оплатить», он запрашивает пин-код, и он зависает при обработке. Ни один из делегатов не вызывается ни в том, ни в другом случае.
Моя реализация:
public func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) {
print("Dismiss")
}
public func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController,
didAuthorizePayment payment: PKPayment,
completion: @escaping (PKPaymentAuthorizationStatus) -> Void) {
completion(.success)
return;
}
@available(iOS 11.0, *)
public func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController,
didAuthorizePayment payment: PKPayment,
handler: @escaping (PKPaymentAuthorizationResult) -> Void) {
handler(PKPaymentAuthorizationResult(status: .success, errors: nil))
return;
}
Ни один из трех методов никогда не вызывается, независимо от того, что я делаю. Я проверил, и делегат настроен правильно.
Есть идеи?