2014-10-10 1 views
1

Мне нужно получить адресную информацию для расчета стоимости доставки и налогов для покупки товаров в моем приложении. Я хочу использовать Apple Pay, поэтому я получаю запись как экземпляр ABRecordRef. Я попыталсяПолучить адрес от ABRecordRef

NSString *zip = (__bridge NSString *)(ABRecordCopyValue(address, kABPersonAddressZIPKey)); 

, но это вызывает EXC_BAD_ACCESS. Я уверен, что должен быть способ заставить его работать, знает ли кто-нибудь это?

+0

Как 'address' определены и получены? –

+0

Проблема, похоже, в вашей переменной «адрес». Можете ли вы поделиться кодом, в котором вы объявили, и инициализировали переменную «адрес»? – Tayyab

+0

@LeoNatan Я получаю его в 'PKPaymentAuthorizationViewControllerDelegate' метод -' paymentAuthorizationViewController: (PKPaymentAuthorizationViewController *) controller didSelectShippingAddress: (ABRecordRef) завершение адреса: (void (^) (PKPaymentAuthorizationStatus, NSArray *, NSArray *)) завершение callback. – Solomiya

ответ

1

Фигурные это наконец:

CFTypeRef addressProperty = ABRecordCopyValue((ABRecordRef)address, kABPersonAddressProperty); 
NSDictionary *addressDict = (__bridge NSDictionary *)CFArrayGetValueAtIndex((CFArrayRef)ABMultiValueCopyArrayOfAllValues(addressProperty), 0); 

Результирующий словарь выглядит следующим образом:

{ 
    City = Hillsborough; 
    CountryCode = us; 
    State = CA; 
    ZIP = 94010; 
} 
+0

Как вы получаете информацию об улицах от этого? –

+1

Полный адрес улицы можно найти в payment.ShippingAddress в обратном вызове didAuthorizePayment. –

+0

На данный момент меня не интересовали улицы - состояние, город и ZIP были достаточно, чтобы удовлетворить мои потребности. Полный адрес доступен в обратном вызове didAuthorizePayment, как сказал @JonC. – Solomiya

0

Допустим, у вас есть идентификатор записи контакта, и вы хотите получить адрес. Ваш код будет как следующий,

ABRecordRef address[1]; 
address[0] = ABAddressBookGetPersonWithRecordID(_addressBook, recId); 
NSString *zip = (__bridge NSString *)(ABRecordCopyValue(address[0], kABPersonAddressZIPKey)); 

Если вы делаете что-то вроде этого, то обратите внимание на выше коде, вам нужно использовать адрес [0] вместо адрес в параметре функционировать ABRecordCopyValue ,

Надеюсь, это поможет.

+0

Я не использую адресную книгу в этом случае - у меня есть только отдельный экземпляр' ABRecordRef'. Нужно ли его создавать? – Solomiya

+0

hmmm. Затем попробуйте вызвать функцию CFRetain() на экземпляр, который вы получите. Когда вы получите экземпляр в обратном вызове, попробуйте вызвать CFRetain (name_of_instance), и как только вы закончите с ним, вы можете вызвать CFRelease. Я надеюсь, что это помогает. – Tayyab