Как вы показываете 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? Я хочу дать конкретные сообщения об ошибках, когда пользователь вводит неверный адрес доставки.

4 ответов


в 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 на обработчик завершения.

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


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

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


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

весь пользовательский интерфейс PKPaymentAuthorizationViewController представлено через дистанционный регулятор взгляда. Это означает, что за пределами 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.успешный или PKPaymentAuthorizationStatus.неудача в зависимости от результата.
  • счетчик pkpaymentauthorizationviewcontroller анимируется в значок успеха или неудачи. В случае успеха придет уведомление из банковской книжки с указанием начисления по кредиту клиента карта.
  • ваш представитель получает paymentAuthorizationViewControllerdidfinish(_:) обратный вызов. Это тогда ответственный за вызов уволить (анимированный: завершение:), чтобы уволить экран оплаты.

Error Screen

Error Screen

- (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's 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];
}

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

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

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

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

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