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


person CTL    schedule 02.06.2015    source источник
comment
как вы представляете предупреждение? Я не слишком много знаю об applepay, но, поскольку это контроллер представления, вы представляете предупреждение в представлении applepayviewcontroller?   -  person Knight0fDragon    schedule 18.07.2017
comment
Не уверен в цели развертывания. Я думаю, что вместо того, чтобы showподавать UIAlertView, лучше было бы presentподелиться UIAlertController. Пока у вас есть ссылка на UIViewController, поверх которого вы хотите показывать предупреждение, это не должно быть проблемой.   -  person Tarun Tyagi    schedule 24.07.2017


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

Подробнее см. на сеансе этого года.

person pesch    schedule 20.07.2017

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

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

person klinger    schedule 19.07.2017

Вы не можете показывать 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:completion:)
  • Ваше приложение асинхронно взаимодействует с обработчиком платежей и серверной частью веб-сайта, чтобы фактически произвести оплату с помощью этих платежных реквизитов. После этого вы вызываете обработчик завершения, указанный в качестве параметра, либо с PKPaymentAuthorizationStatus.success, либо с PKPaymentAuthorizationStatus.failure в зависимости от результата.
  • Счетчик PKPaymentAuthorizationViewController анимируется в виде значка успеха или неудачи. В случае успеха от PassBook придет уведомление о списании средств с кредитной карты клиента.
  • Ваш делегат получает обратный вызов paymentAuthorizationViewControllerDidFinish(_:). Затем он отвечает за вызов reject(animated:completion:) для закрытия экрана оплаты.

Экран ошибки

Экран ошибки

- (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];
}
person Nikhlesh Bagdiya    schedule 19.07.2017

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

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

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

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

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

person Deepak    schedule 25.07.2017