Xcode 在后台访问通讯簿

Xcode 在后台访问通讯簿,xcode,addressbook,Xcode,Addressbook,我一直在尝试设置一种方法来获取用户通讯簿中所有人的姓名以及他们的(多个)电话号码,但我的尝试不起作用,当我记录应该包含联系人姓名的数组时,它返回为NULL 这是我正在使用的代码。此外,我还为通讯簿导入了正确的支持文件。我确实有一种感觉,数组返回null是因为地址簿的创建方式,但我不确定是否是这样,或者如何修复它。任何帮助都会非常有用 //main code - (void)getPersonOutOfAddressBook { CFErrorRef error = NULL; ABAddre

我一直在尝试设置一种方法来获取用户通讯簿中所有人的姓名以及他们的(多个)电话号码,但我的尝试不起作用,当我记录应该包含联系人姓名的数组时,它返回为NULL

这是我正在使用的代码。此外,我还为通讯簿导入了正确的支持文件。我确实有一种感觉,数组返回null是因为地址簿的创建方式,但我不确定是否是这样,或者如何修复它。任何帮助都会非常有用

//main code 
- (void)getPersonOutOfAddressBook
{

CFErrorRef error = NULL;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);

if (addressBook != nil) {
    NSLog(@"Succesful.");


    NSArray *allContacts = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);

        //testing. This returns NULL
        NSLog(@"%@", allContacts);

    NSUInteger i = 0;
    for (i = 0; i < [allContacts count]; i++)
    {
        ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i];
        NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson,kABPersonFirstNameProperty);
        NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson, kABPersonLastNameProperty);
        NSString *fullName = [NSString stringWithFormat:@"%@ %@", firstName, lastName];

    }

    CFRelease(addressBook);
} else {

    NSLog(@"Error reading Address Book");
}
}

//checking if access is allowed

- (void)checkForAddressBookAccess
{
    ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(nil, nil);

if (ABAddressBookRequestAccessWithCompletion == NULL)
{
    // iOS5 
    [self getPersonOutOfAddressBook];
    return;
}
else
{
    // iOS6
    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined)
    {
        ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
            if(error)
            {
                //error
            }
            else
            {
                [self getPersonOutOfAddressBook];
            }
        });
    }
    else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized)
    {
        [self getPersonOutOfAddressBook];
    }
    else
    {
       //error
    }
}
}
//主代码
-(无效)GetPersonAutoFadDressbook
{
CFErrorRef error=NULL;
ABAddressBookRef addressBook=ABAddressBookCreateWithOptions(NULL,错误(&R);
如果(地址簿!=nil){
NSLog(@“成功”);
NSArray*所有联系人=(u_u桥u传输NSArray*)ABAddressBookCopyArrayFallPeople(addressBook);
//正在测试。这将返回NULL
NSLog(@“%@”,所有联系人);
整数i=0;
对于(i=0;i<[allContacts count];i++)
{
ABRecordRef contactPerson=(桥ABRecordRef)所有联系人[i];
NSString*firstName=(桥接传输NSString*)ABRECORDCYVALUE(contactPerson,KabbersonfirstNameProperty);
NSString*lastName=(uu_桥u传输NSString*)ABRECORDCYVALUE(contactPerson,kABPersonLastNameProperty);
NSString*fullName=[NSString stringWithFormat:@“%@%@”,firstName,lastName];
}
CFRelease(通讯录);
}否则{
NSLog(@“读取通讯簿时出错”);
}
}
//检查是否允许访问
-(无效)checkForAddressBookAccess
{
ABAddressBookRef addressBookRef=ABAddressBookCreateWithOptions(无,无);
if(ABAddressBookRequestAccessWithCompletion==NULL)
{
//损失5
[self-GetPersonoAutoFadDressbook];
返回;
}
其他的
{
//损失6
if(ABAddressBookGetAuthorizationStatus()==kABAuthorizationStatusNotDetermined)
{
ABAddressBookRequestAccessWithCompletion(addressBookRef,^(已授予bool,CFErrorRef错误){
如果(错误)
{
//错误
}
其他的
{
[self-GetPersonoAutoFadDressbook];
}
});
}
else if(ABAddressBookGetAuthorizationStatus()==kABAuthorizationStatusAuthorized)
{
[self-GetPersonoAutoFadDressbook];
}
其他的
{
//错误
}
}
}