Как получить адрес электронной почты и номер телефона из Apple Pay с помощью Swift

Я могу успешно получить все данные из Apple Pay, включая зашифрованные платежные данные, имя, фамилию и платежный адрес. Однако я не могу понять, как получить номер телефона и адрес электронной почты из раздела «Контакты», отображаемого при оплате через Apple Pay. Мне нужно получить эти значения, чтобы я мог отправить их моему нижестоящему поставщику платежей. Пожалуйста помоги:

extension ViewController: PKPaymentAuthorizationViewControllerDelegate {

    /* USER HAS AUTHORIZED PAYMENT */
    func paymentAuthorizationViewController(controller: PKPaymentAuthorizationViewController!, didAuthorizePayment payment: PKPayment!, completion: ((PKPaymentAuthorizationStatus) -> Void)!) {

        //Declare a dictionary of request parameters
        var parameters = Dictionary<String, String>()

        //Get Encrypted Payment Data from AP
        parameters["encryptedPayment_data"] = payment.token.paymentData.base64EncodedStringWithOptions(nil)

        let billingAddress: ABRecord = payment.billingAddress

        parameters["billTo_firstName"] = ABRecordCopyValue(billingAddress, kABPersonFirstNameProperty).takeRetainedValue() as? String
        parameters["billTo_lastName"] = ABRecordCopyValue(billingAddress, kABPersonLastNameProperty).takeRetainedValue() as? String

        //Extract billing address from ABRecord format and assign accordingly
        let addressProperty: ABMultiValueRef = ABRecordCopyValue(billingAddress, kABPersonAddressProperty).takeUnretainedValue() as ABMultiValueRef

        if let dict: NSDictionary = ABMultiValueCopyValueAtIndex(addressProperty, 0).takeUnretainedValue() as? NSDictionary {
            parameters["billTo_street1"] = dict[String(kABPersonAddressStreetKey)] as? String
            parameters["billTo_city"] = dict[String(kABPersonAddressCityKey)] as? String
            parameters["billTo_state"] = dict[String(kABPersonAddressStateKey)] as? String
            parameters["billTo_postalCode"] = dict[String(kABPersonAddressZIPKey)] as? String
            parameters["billTo_country"] = dict[String(kABPersonAddressCountryKey)] as? String //"United States"
        }

        //Can't figure out how to obtain these from Apple Pay!
        parameters["billTo_email"] = "[email protected]"
        parameters["billTo_phoneNumber"] = "5555555555"

person Jeff    schedule 28.04.2015    source источник


Ответы (1)


ты можешь попробовать

let emails: ABMultiValueRef = ABRecordCopyValue(billingAddress, kABPersonEmailProperty).takeRetainedValue() as ABMultiValueRef
  if ABMultiValueGetCount(emails) > 0 {
    let email = ABMultiValueCopyValueAtIndex(emails, 0).takeRetainedValue() as String
    NSLog(email)  
  }
person chrismillah    schedule 28.04.2015
comment
Спасибо за ответ, однако первая строка кода приводит к фатальной ошибке: неожиданно найдено nil при распаковке необязательного значения (lldb). Я интерпретирую это как означающее, что kABPersonEmailProperty имеет значение nil в payment.billingAddress, возвращенном из Apple Pay. Где еще могут быть раскрыты электронная почта и телефон? - person Jeff; 28.04.2015
comment
Забыл упомянуть, что я устанавливаю адрес для выставления счетов и доставки как обязательный, и они ДЕЙСТВИТЕЛЬНО появляются в процессе проверки точки доступа: request.requiredBillingAddressFields = PKAddressField.All;request.requiredShippingAddressFields = PKAddressField.All; - person Jeff; 28.04.2015
comment
Сюжет усложняется... Я могу получить электронное письмо, используя ваш код, из payment.shippingAddress, но payment.billingAddress возвращает ноль. Интересно, Apple намеренно скрывает это? - person Jeff; 28.04.2015
comment
В платежном листе Apple Pay есть только одно место для ввода информации об электронной почте и телефоне, и они возвращаются под shippingAddress, а не billingAddress. - person lxt; 28.04.2015
comment
Может ли кто-нибудь преобразовать это в Objective C, пожалуйста. - person Laxy; 22.03.2016
comment
@Jeff Джефф Вы смогли получить адрес электронной почты? - person Mac_Play; 21.09.2019