如何加载阵列ios9中的所有联系人

时间:2015-10-26 12:32:11

标签: uitableview ios9 cncontact cncontactstore cncontactformatter

在ios 9中不推荐使用

AddressBook api。我想在数组中加载所有联系人并将其显示在UITableView中。我不想使用iOS默认ContactPicker,因为我必须在显示时进行一些自定义。如何加载数组中的所有联系人列表以供进一步使用?

1 个答案:

答案 0 :(得分:1)

首先,我必须检查未定义的权限ID,然后请求访问联系人的权限。像这样:

CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];

if (status == CNAuthorizationStatusNotDetermined) {
    [self.contactStore requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError *error) {

        if (granted) {
            [self loadUserListFromPhoneBook];
        }
    }];
}
else if(status == CNAuthorizationStatusAuthorized) {
    [self loadUserListFromPhoneBook];
}

之后我不得不遍历联系人列表并加载所有联系人:

-(void) loadUserListFromPhoneBookFor
{
    NSMutableArray *contacts = [NSMutableArray array];
    NSError *error;
    CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:@[CNContactIdentifierKey, [CNContactFormatter descriptorForRequiredKeysForStyle:CNContactFormatterStyleFullName]]];

    BOOL success = [self.contactStore enumerateContactsWithFetchRequest:request error:&error usingBlock:^(CNContact *contact, BOOL *stop) {
        [contacts addObject:contact];
    }];
    if (!success) {
        NSLog(@"error = %@", error);
    }

    CNContactFormatter *formatter = [[CNContactFormatter alloc] init];

    for (CNContact *contact in contacts) {
        NSString *string = [formatter stringFromContact:contact];
        NSLog(@"contact = %@", string);
    }
}

您可以使用必要的密钥来获取更多信息。有look at this了解更多信息。它有所有新的联系类。 This video of WWDC帮了很多忙。