我的应用在授权检查后没有显示设备的联系人

时间:2014-05-22 14:07:52

标签: ios abaddressbook

在我的应用中,我必须访问地址簿,因此在iOS> 6.0中,我必须向用户请求权限。 我这样做:

ABAddressBookRef addressBook = ABAddressBookCreate();

if(floor(NSFoundationVersionNumber) >= NSFoundationVersionNumber_iOS_6_0)
{
    //iOS is >= 6.0
    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined)
    {
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
                                                 {
                                                     if (granted)
                                                     {
                                                         [self showContacts:addressBook];
                                                     }
                                                 });


    }
    else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized)
    {
        [self showContacts:addressBook];
    }
    else
    {
        //showAccessDeniedAlert();
    }
}
else
{
    //iOS is < 6.0
    [self showContacts:addressBook];
}

showContacts中一切都好,但是:我第一次在设备上使用该应用程序时,它询问我是否要让它访问AddressBook,我按“确定”并showContacts不叫!所以我必须关闭应用程序,重新启动它,它才能完美运行。

这是我的showContacts方法:

- (void) showContacts:(ABAddressBookRef)addressBook
{
    CFArrayRef allContacts = ABAddressBookCopyArrayOfAllPeople(addressBook);
    CFIndex numberOfContacts = ABAddressBookGetPersonCount(addressBook);

    for (int ii = 0; ii < numberOfContacts; ii++)
    {
        ABRecordRef contactRef = CFArrayGetValueAtIndex(allContacts, ii);
        ABMultiValueRef *phones = ABRecordCopyValue(contactRef, kABPersonPhoneProperty);
        for(CFIndex jj = 0; jj < ABMultiValueGetCount(phones); jj++)
        {
            CEPerson *person = [[CEPerson alloc] init];
            NSString *name = (__bridge_transfer NSString *)ABRecordCopyValue(contactRef,kABPersonFirstNameProperty);
            NSString *surname = (__bridge_transfer NSString *)ABRecordCopyValue(contactRef, kABPersonLastNameProperty);
            CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(phones, jj);
            NSString *phoneNumber = (__bridge NSString *)phoneNumberRef;

            person.name = name;
            person.surname = surname;
            person.telephone = phoneNumber;

            [arrContacts addObject:person];
        }
    }
    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"surname" ascending:YES];
    [arrContacts sortUsingDescriptors:[NSArray arrayWithObject:sort]];
    [self selectAllContacts];
}

如果用户按下“确定”后如何才能使其正常工作?

谢谢大家。

1 个答案:

答案 0 :(得分:0)

我明白了。我只是添加了

[tableView reloadData];

showContacts方法的最后。