Как получить только почтовый адрес от CNContacts в Xcode Objective-C

Я пытаюсь получить только адрес для всех контактов в CNContacts. Мне удалось получить заданное имя и имя семьи в виде NSString, и я смог получить почтовый адрес в виде массива с улицей, городом, почтовым индексом и т. д., но я хотел бы получить только адрес улицы из массива в виде строки .
Вот мой код

 CNContactStore *store = [[CNContactStore alloc] init];
                          [store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
                              if (granted == YES) {
                                  //keys with fetching properties
                                  NSArray *keys = @[CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPostalAddressesKey,CNPostalAddressStreetKey,CNPostalAddressCityKey,CNPostalAddressPostalCodeKey];
                                  NSString *containerId = store.defaultContainerIdentifier;
                                  NSPredicate *predicate = [CNContact predicateForContactsInContainerWithIdentifier:containerId];
                                  NSError *error;
                                  NSArray *cnContacts = [store unifiedContactsMatchingPredicate:predicate keysToFetch:keys error:&error];
                                   if (error) {
                                      NSLog(@"error fetching contacts %@", error);
                                  }  else {
                                      
                                     for (CNContact *contact in cnContacts) {
                                         NSString *firstNames = contact.givenName;
                                          NSString *lastNames = contact.familyName;
                                    
                                         NSMutableArray *streetName = [[NSMutableArray alloc]initWithObjects:contact.postalAddresses, nil];
                                        
                                         NSLog(@"streets:::%@",streetName); }}}}];

Я использую Objective-c, и есть несколько примеров со Swift, но не с Objc. Может кто-нибудь показать мне, как это сделать, пожалуйста.


person user1114881    schedule 12.02.2021    source источник


Ответы (1)


Согласно документации для свойства postalAddresses объекта CNContact (https://developer.apple.com/documentation/contacts/cncontact/1403066-postaladdresses?language=objc) определяется следующим образом:

NSArray<CNLabeledValue<CNPostalAddress*>*>* postalAddresses;

Это означает, что он содержит массив объектов CNLabeledValue, каждый из которых содержит CNPostalAddress. Это позволяет хранить каждый почтовый адрес вместе с меткой, которая его описывает, а также хранить несколько адресов с одной и той же меткой.

введите здесь описание изображения

введите здесь описание изображения

На приведенных выше снимках экрана видно, что пользователю разрешено выбирать любую из 4 предопределенных меток или создавать свою собственную метку (любую из которых можно использовать несколько раз) при добавлении адреса к контакту.

CNContactStore* store = [[CNContactStore alloc] init];
[store requestAccessForEntityType:CNEntityTypeContacts
                completionHandler:^(BOOL granted, NSError * _Nullable error) {

    if (error)
    {
        NSLog(@"Error accessing contacts %@", error.debugDescription);

        return;
    }

    if (granted)
    {
        NSArray* keys = @[ CNContactFamilyNameKey,
                           CNContactGivenNameKey,
                           CNContactPostalAddressesKey,
                           CNPostalAddressStreetKey,
                           CNPostalAddressCityKey,
                           CNPostalAddressPostalCodeKey
                         ];

        NSString* containerId = store.defaultContainerIdentifier;
        NSPredicate* predicate = [CNContact predicateForContactsInContainerWithIdentifier:containerId];

        NSError* contactsError;
        NSArray* contacts = [store unifiedContactsMatchingPredicate:predicate
                                                        keysToFetch:keys
                                                              error:&contactsError];

        if (contactsError)
        {
            NSLog(@"Error fetching contacts %@", contactsError.debugDescription);
        }

        else
        {
            for (CNContact* contact in contacts)
            {
                NSString* firstName = contact.givenName;
                NSString* lastName = contact.familyName;

                NSLog(@"%@ %@:", firstName, lastName);

                for ( CNLabeledValue* lVal in contact.postalAddresses )
                {
                    // start with the assumption of a custom label
                    NSString* label = lVal.label;

                    if ( [CNLabelHome isEqualToString:label] )
                    {
                        label = @"Home";
                    }

                    else if ( [CNLabelWork isEqualToString:label] )
                    {
                        label = @"Work";
                    }

                    else if ( [CNLabelSchool isEqualToString:label] )
                    {
                        label = @"School";
                    }

                    else if ( [CNLabelOther isEqualToString:label] )
                    {
                        label = @"Other";
                    }

                    CNPostalAddress* address = (CNPostalAddress*)lVal.value;

                    NSLog(@"%@: [%@]", label, address.street);
                }
            }
        }
    }

    else
    {
        NSLog(@"Contact access NOT granted!");
    }
}];

Приведенный выше пример был основан только на вашем размещенном коде и просто регистрирует имя каждого контакта, за которым следует каждый (помеченный) адрес, сохраненный для них, на консоль. После этого вы можете делать все, что хотите, например, добавлять их в свой собственный массив или выполнять любую дальнейшую обработку по своему желанию.

person BenW    schedule 15.02.2021
comment
Большое спасибо я понял - person user1114881; 16.02.2021