Как получить почтовый адрес от ABPeoplePickerNavigationController - PullRequest
4 голосов
/ 30 ноября 2011

Мне нужен уличный адрес контакта. Я знаю, как получить свойства с одним значением, но адрес улицы является многозначным свойством. Документация Apple показывает, как установить его, но не получить его. Любая помощь?

PS: это не работает:

ABRecordCopyValue(person, kABPersonAddressStreetKey);

Ответы [ 6 ]

9 голосов
/ 02 декабря 2011

Я только что понял:

ABMultiValueRef st = ABRecordCopyValue(person, kABPersonAddressProperty);
if (ABMultiValueGetCount(st) > 0) {
    CFDictionaryRef dict = ABMultiValueCopyValueAtIndex(st, 0);
    self.street.text = CFDictionaryGetValue(dict, kABPersonAddressStreetKey);
}
3 голосов
/ 29 августа 2015

Swift версия:

    if let addresses : ABMultiValueRef = ABRecordCopyValue(person, kABPersonAddressProperty)?.takeRetainedValue() as ABMultiValueRef? where ABMultiValueGetCount(addresses) > 0 {
        for index in 0..<ABMultiValueGetCount(addresses){
            if let address = ABMultiValueCopyValueAtIndex(addresses, index)?.takeRetainedValue() as? [String:String],
                label = ABMultiValueCopyLabelAtIndex(addresses, index)?.takeRetainedValue()  as? String{
                    print("\(label): \(address) \n")
            }
        }
    }

Вы можете получить доступ к отдельному полю адреса, указав соответствующий ключ:

let street  = address[kABPersonAddressStreetKey as String]
let city    = address[kABPersonAddressCityKey as String]
let state   = address[kABPersonAddressStateKey as String]
let zip     = address[kABPersonAddressZIPKey as String]
let country = address[kABPersonAddressCountryKey as String]
let code    = address[kABPersonAddressCountryCodeKey as String]
2 голосов
/ 21 октября 2016

Swift 3.0

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

if let dict: NSDictionary = ABMultiValueCopyValueAtIndex(addressProperty, 0).takeUnretainedValue() as? NSDictionary {
     print(dict[String(kABPersonAddressStreetKey)] as? String)
     print(dict[String(kABPersonAddressCityKey)] as? String)
     print(dict[String(kABPersonAddressStateKey)] as? String)
     print(dict[String(kABPersonAddressZIPKey)] as? String)
     print(dict[String(kABPersonAddressCountryKey)] as? String) //"United States"
}
1 голос
/ 18 февраля 2014

Если для пользователя определено несколько адресов - рабочий, домашний и т. Д., Вам потребуется использовать атрибут идентификатора, чтобы различать их. То, к чему я пришел, взято из похожих постов на адресах электронной почты:

#pragma mark - ABPeoplePickerNavigationControllerDelegate

- (IBAction)chooseContact:(id)sender
{
    ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
    picker.peoplePickerDelegate = self;
    [self presentViewController:picker animated:YES completion:nil];
//    [self dismissViewControllerAnimated:YES completion:nil];
}


- (void) peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
{
    [self dismissViewControllerAnimated:YES completion:nil];
}


- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker
      shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
    return YES;
}


- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker
      shouldContinueAfterSelectingPerson:(ABRecordRef)person
                                property:(ABPropertyID)property
                              identifier:(ABMultiValueIdentifier)identifier
{
    if (property == kABPersonAddressProperty)
    {
        ABMultiValueRef addresses = ABRecordCopyValue(person, property);
        CFIndex addressIndex = ABMultiValueGetIndexForIdentifier(addresses, identifier);
        CFDictionaryRef address = ABMultiValueCopyValueAtIndex(addresses, addressIndex);

        // create address string to lookup
        NSString *street = (NSString*) CFDictionaryGetValue(address, kABPersonAddressStreetKey);
        NSString *city = (NSString*) CFDictionaryGetValue(address, kABPersonAddressCityKey);
        NSString *state = (NSString*) CFDictionaryGetValue(address, kABPersonAddressStateKey);
        NSString *postal = (NSString*) CFDictionaryGetValue(address, kABPersonAddressZIPKey);
        NSString *country = (NSString*) CFDictionaryGetValue(address, kABPersonAddressCountryKey);

        CFRelease(address);
        CFRelease(addresses);
        [self dismissViewControllerAnimated:YES completion:nil];
        return NO;
    }

    return YES;
}

.

0 голосов
/ 24 января 2018

Инфраструктура пользовательского интерфейса адресной книги устарела в iOS 9. Вместо этого используйте API, определенные в платформе ContactsUI. Чтобы узнать больше, см. ContactsUI .

0 голосов
/ 30 ноября 2011

Полагаю, это должно работать так (получено из документации, не проверено):

...