Как вы показываете UIAlertView над Apple Pay PKPaymentAuthorizationViewController?

Используя стандартный код UIAlertView ниже, вы увидите предупреждение под листом Apple Pay PKPaymentAuthorizationViewController.

[[[UIAlertView alloc] initWithTitle:@"Payment Error"
                            message:[error localizedDescription]
                           delegate:nil
                  cancelButtonTitle:@"Okay"
                  otherButtonTitles:nil] show];

Как я могу показать его выше листа авторизации оплаты? Или есть другой способ представления сообщений об ошибках для Apple Pay? Я хочу дать конкретные сообщения об ошибках, когда пользователь вводит неверный адрес доставки.

Ответы

Ответ 1

В iOS 11 появился новый обратный вызов для

public func paymentAuthorizationController(_ controller: PKPaymentAuthorizationController, didAuthorizePayment payment: PKPayment,
handler completion: (PKPaymentAuthorizationResult) -> Void)

Как вы можете видеть, обработчик изменяется с

completion: (PKPaymentAuthorizationStatus) -> Void)

to

handler completion: (PKPaymentAuthorizationResult) -> Void)

Начиная с iOS 11, мы получим status с массивом NSErrors в обработчике завершения.

Посмотрите сеанс в этом году для более подробной информации.

Ответ 2

Вы не можете отображать элементы пользовательского интерфейса поверх любого Remote View Controllers, поскольку это может поставить под угрозу безопасность системы. Это включает PKPaymentAuthorizationViewController.

Подробнее о контроллерах удаленного просмотра здесь

Ответ 3

Вы не можете показать UIAlertView в PKPaymentAuthorizationViewController из-за безопасности системы.

Весь пользовательский интерфейс PKPaymentAuthorizationViewController представлен через Remote View Controller. Это означает, что за пределами PKPaymentRequest вы его даете, его невозможно в противном случае изменить или изменить содержимое этого представления.

И для обработки ошибки Apple Pay вы должны использовать метод делегата PKPaymentAuthorizationViewControllerDelegate, чтобы показать, что платеж успешно завершен или имеются какие-либо ошибки.

Для показа PKPaymentAuthorizationViewController, настоящий платежный контроллер, как:

PKPaymentAuthorizationViewController *paymentVC = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
paymentVC.delegate = self;
[self presentViewController:paymentVC animated:true completion:nil];
  • Клиент подтверждает покупку с помощью Touch ID (или, если это не удается 3 раза, введя свой код доступа).
  • Значок пиктограммы превращается в прядильщик с надписью "Обработка"
  • Ваш делегат получает paymentAuthorizationViewController (_: didAuthorizePayment: завершение:) Обратный вызов
  • Ваше приложение связывается асинхронно с вашим платежом процессор и веб-сайт, чтобы фактически взимать плату с этих Детали оплаты. Как только это будет завершено, вы вызываете завершение обработчик, который вы указываете как параметр с помощью PKPaymentAuthorizationStatus.success или PKPaymentAuthorizationStatus.failure в зависимости от результата.
  • Spinner PKPaymentAuthorizationViewController оживляет значок успеха или неудачи. В случае успеха будет отправлено уведомление от PassBook с указанием платы за кредитную карту клиентов.
  • Ваш делегат получает paymentAuthorizationViewControllerDidFinish (_:) callback. Тогда ответственный за вызов увольнения (анимированный: завершение:), чтобы отклонить оплата экран.

Экран ошибок

Экран ошибок

- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
                       didAuthorizePayment:(PKPayment *)payment
                                completion:(void (^)(PKPaymentAuthorizationStatus status))completion {

    //=========================================
    //=========================================
    //    Call your api here for charge payment and according to that api result show complition as follow
    //========================================
    //========================================


    // Use your payment processor SDK to finish charging your customer.
    // When this is done, call:
    completion(PKPaymentAuthorizationStatusSuccess);

    // When this is Payment not completed, call:
//    completion(PKPaymentAuthorizationStatusFailure);

    // When this is Supplied billing address is insufficient or otherwise invalid, call:
//    completion(PKPaymentAuthorizationStatusInvalidBillingPostalAddress);

    // When this is Supplied postal address is insufficient or otherwise invalid, call:
//    completion(PKPaymentAuthorizationStatusInvalidShippingPostalAddress);

    // When this is Supplied contact information is insufficient or otherwise invalid, call:
//    completion(PKPaymentAuthorizationStatusInvalidShippingContact);
}


// Sent to the delegate when payment authorization is finished.  This may occur when
// the user cancels the request, or after the PKPaymentAuthorizationStatus parameter of the
// paymentAuthorizationViewController:didAuthorizePayment:completion: has been shown to the user.
//
// The delegate is responsible for dismissing the view controller in this method.
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller {
    [self dismissViewControllerAnimated:true completion:nil];
}

Ответ 4

Лист действия - это особый стиль предупреждения, который появляется в ответ на элемент управления или действие, и представляет собой набор из двух или более вариантов, связанных с текущим контекстом. Используйте лист действий, чтобы люди могли инициировать задачи или запрашивать подтверждение перед выполнением потенциально разрушительной операции. На маленьких экранах экран действий перемещается снизу вверх. На больших экранах лист действий появляется сразу как popover.

Предоставьте кнопку "Отмена", если она добавит ясности. Кнопка "Отмена" повышает уверенность, когда пользователь отказывается от задачи. Кнопки отмены всегда должны включаться в панели действий в нижней части экрана.

Сделайте вид разрушительного выбора. Используйте красный цвет для кнопок, которые выполняют деструктивные или опасные действия, и отображают эти кнопки в верхней части листа действий.

Избегайте включения прокрутки в листе действий. Если в листе действий слишком много опций, люди должны прокрутить, чтобы просмотреть все варианты. Для прокрутки требуется дополнительное время, чтобы сделать выбор, и его трудно обойти без случайного нажатия кнопки.

Для руководства разработчика см. UIAlertControllerStyleActionSheet константа в UIAlertController.