列出号码为 phone 的联系人

List contacts with phone numbers

我想获取(在 iOS 中使用 Objective-C)仅具有 phone 号码的联系人,但我该怎么做?我正在尝试按照下面的代码构建谓词,但显然这不起作用。

contacts = [contactStore unifiedContactsMatchingPredicate:[NSPredicate predicateWithFormat:@"phoneNumbers <> nil"] keysToFetch:KEYS error:nil];

那么,正确的做法是什么?感谢您的帮助!

使用以下方法导入

#import <AddressBook/AddressBook.h>
#import <Contacts/Contacts.h> 


-(void)contactsDetailsFromPhoneContactBook{
    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];
            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 {
                NSString *fullName;
                NSString *firstName;
                NSString *lastName;
                for (CNContact *contact in cnContacts) {
                    // copy data to my custom Contacts class.
                    firstName = contact.givenName;
                    lastName = contact.familyName;
                    if (lastName == nil) {
                        fullName=[NSString stringWithFormat:@"%@",firstName];
                    }else if (firstName == nil){
                        fullName=[NSString stringWithFormat:@"%@",lastName];
                    }
                    else{
                        fullName=[NSString stringWithFormat:@"%@ %@",firstName,lastName];
                    }
                    [self.contactsArray addObject:fullName];

                    NSLog(@"working or not %@",self.contactsArray);
                }

            }
        }
    }];
}
#import <Contacts/Contacts.h>


 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, CNContactPhoneNumbersKey, CNContactImageDataKey, CNContactEmailAddressesKey];
            CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:keys];
            request.sortOrder = CNContactSortOrderGivenName;
            request.unifyResults = YES;
            NSError *error;

            __block NSString* email;

            BOOL success = [store enumerateContactsWithFetchRequest:request error:&error usingBlock:^(CNContact * __nonnull contact, BOOL * __nonnull stop)
                            {
                                if (error) {
                                    NSLog(@"error fetching contacts %@", error);
                                } else {
                                    NSString *fullName;
                                    NSString* phone;

                                    //                    for (CNContact *contact in cnContacts) {
                                    DeviceContact *aContact = [DeviceContact new];

                                    // copy data to my custom Contacts class.
                                    NSString *firstName = contact.givenName;
                                    NSString *lastName = contact.familyName;

                                    if (lastName == nil) {
                                        fullName=[NSString stringWithFormat:@"%@",firstName];
                                    }else if (firstName == nil){
                                        fullName=[NSString stringWithFormat:@"%@",lastName];
                                    }
                                    else{
                                        fullName=[NSString stringWithFormat:@"%@ %@",firstName,lastName];
                                    }

                                    if ([firstName trim].length > 0) {
                                        aContact.nameForSorting = firstName; // 141116
                                    }else if ([lastName trim].length>0 && aContact.nameForSorting.length<=0) {
                                        aContact.nameForSorting = lastName; // 141116
                                    }

                                    aContact.name = fullName;


                                    if (contact.phoneNumbers!=nil && [contact.phoneNumbers count]>0) {
                                        for (CNLabeledValue *label in contact.phoneNumbers) {
                                            phone =  [CommonUtils removeAllSpecialCharactersFromPhoneNumber:[label.value stringValue]];
                                            if ([phone length] > 0) {
                                                [aContact.phoneNumber addObject:phone];
                                            }
                                        }
                                    }

                                    ////Get all E-Mail addresses from contacts
                                    /// if ([CommonUtils checkIsNullObject:[contact emailAddresses]] && [[contact emailAddresses] count]>0) {
                                    for (CNLabeledValue *label in contact.emailAddresses) {
                                        email = label.value;
                                        if ([email length] > 0)
                                        {
                                            [aContact.email addObject:email];
                                        }
                                    }
                                    // }

                                    // 141116
                                    if ([aContact.name trim].length <= 0) {
                                        if (aContact.email.count>0) {
                                            aContact.name = [aContact.email objectAtIndex:0];
                                        }else if (aContact.phoneNumber.count>0){
                                            aContact.name = [aContact.phoneNumber objectAtIndex:0];
                                        }
                                    }
                                    if ([aContact.nameForSorting trim].length <= 0){
                                        if (aContact.email.count>0) {
                                            aContact.nameForSorting = [aContact.email objectAtIndex:0];
                                        }else if (aContact.phoneNumber.count>0){
                                            aContact.nameForSorting = [aContact.phoneNumber objectAtIndex:0];
                                        }
                                    }

                                    [self.arrAllContacts addObject:aContact];
                                }

                            }];

            if(success){

                dispatch_async(dispatch_get_main_queue(), ^{
                    [CommonUtils hideLoader];

                    completionhandler(self.arrAllContacts);
                });
            }
        }
        else
        {
           // [CommonUtils showAlertMessageWithMessage:@"fdfdggfsgfdgfd" withDelegate:self withCancelTitle:OKAY isOtherButton:NO withOtherButtonTitle:nil withTag:0];
            [CommonUtils hideLoader];

        }
    }];

无法过滤掉没有 phone 号码(或其他 属性)的联系人。在我们阅读的文档中:

CNContact Predicates

Predicates to match contacts. You can only use these predicates with CNContactStore and CNContactFetchRequest.

  • predicateForContactsMatchingName: Returns a predicate to find the contacts matching the specified name.
  • predicateForContactsWithIdentifiers: Returns a predicate to find the contacts matching the specified identifiers.
  • predicateForContactsInGroupWithIdentifier: Returns a predicate to find the contacts that are members in the specified group.
  • predicateForContactsInContainerWithIdentifier: Returns a predicate to find the contacts in the specified container.

另外:

Compound predicates are not supported.

因此,进行过滤的唯一方法是省略将没有 phone 号码的联系人添加到结果数组。例如,这可以在 enumerateContactsWithFetchRequest.

的块中完成