Загрузка адреса доставки Apple Pay No Street

Я пытаюсь получить адрес доставки, извлеченный из ABRecordRef, предоставленного Apple. У меня есть следующее, но моя улица всегда возвращается как nil:

ABMultiValueRef addresses = ABRecordCopyValue(abRecordRef, kABPersonAddressProperty);

for (CFIndex index = 0; index < ABMultiValueGetCount(addresses); index++)
{
    CFDictionaryRef properties = ABMultiValueCopyValueAtIndex(addresses, index);
    NSString *street = [(__bridge NSString *)(CFDictionaryGetValue(properties, kABPersonAddressStreetKey)) copy];
    NSLog(@"street: %@", street);
}

Что я делаю не так?

Даже при отладке со следующим:

- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
                  didSelectShippingAddress:(ABRecordRef)customShippingAddress
                                completion:(void (^)(PKPaymentAuthorizationStatus status, NSArray *methods, NSArray *items))completion
{
    NSLog(@"%@", ABRecordCopyValue(customShippingAddress, kABPersonAddressProperty);
    completion(PKPaymentAuthorizationStatusSuccess, ..., ...);
}

Я получаю это без улицы:

ABMultiValueRef 0x17227fbc0 with 1 value(s)
    0: Shipping (0x17227fa00) - {
    City = "Marina del Rey";
    Country = "United States";
    State = California;
    ZIP = 90292;
} (0x172447440)

Изменить:

У меня также возникают проблемы с доступом к именам и атрибутам телефона:

NSString *name = (__bridge_transfer NSString *)(ABRecordCopyCompositeName(abRecordRef));

NSString *fname = (__bridge_transfer NSString *)ABRecordCopyValue(abRecordRef, kABPersonFirstNameProperty);
NSString *lname = (__bridge_transfer NSString *)ABRecordCopyValue(abRecordRef, kABPersonFirstNameProperty);

if (!name && fname && lname) name = [NSString stringWithFormat:@"%@ %@", fname, lname]; 
NSLog(@"name: %@", name); // nil

Вот как создается PKPaymentRequest:

PKPaymentRequest *pr = [[PKPaymentRequest alloc] init];    
[pr setMerchantIdentifier:@"********"];
[pr setCountryCode:@"US"];
[pr setCurrencyCode:@"USD"];
[pr setMerchantCapabilities:PKMerchantCapability3DS];
[pr setSupportedNetworks:@[PKPaymentNetworkAmex, PKPaymentNetworkVisa, PKPaymentNetworkMasterCard]];

[pr setPaymentSummaryItems:[self paymentSummaryItems]];

[pr setRequiredBillingAddressFields:PKAddressFieldAll];
[pr setRequiredShippingAddressFields:PKAddressFieldAll];

[pr setShippingMethods:[self supportedShippingMethods]];

person Kevin Sylvestre    schedule 22.10.2014    source источник


Ответы (1)


Оказывается, документы Apple по этому вопросу не так хороши, но проблема в том, что в обратном вызове делегата для paymentAuthorizationViewController:didSelectShippingAddress:completion: всегда возвращается частичный адрес. Исправление состоит в том, чтобы также установить его в обратном вызове из:

- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
                       didAuthorizePayment:(PKPayment *)payment
                                completion:(void (^)(PKPaymentAuthorizationStatus))completion
{
    // Use this instead.
    [payment shippingAddress];
}

Так же убрал призыв к установке нужных биллинг адресов (может отдельный баг).

person Kevin Sylvestre    schedule 23.10.2014
comment
Верный. В целях безопасности возвращаются только частичные адреса, которых достаточно для расчета тарифов на доставку, которые будут отображаться до того, как пользователь аутентифицирует платеж. После аутентификации пользователь фактически одобрил доступ к полному адресу, который он предоставил, иначе доставка была бы невозможна. - person runmad; 07.11.2015
comment
Следует иметь в виду, что почтовые индексы Канады и Великобритании не возвращаются в виде полных почтовых индексов (только частичные), что может затруднить расчет стоимости доставки для этих стран с определенными перевозчиками. - person runmad; 07.11.2015