ios - 从 iOS SDK 获取 iPhone 联系人时出现问题

标签 ios iphone xcode ios6 xcode5

我正在我的应用程序中获取 iPhone 联系人列表。我为此制作了一个示例应用程序并打印了它的值,效果很好。

 ABAddressBookRef ab=ABAddressBookCreate();
    NSArray *arrTemp=(NSArray *)ABAddressBookCopyArrayOfAllPeople(ab);

    NSLog(@"Array===%@",arrTemp);

    NSMutableArray *arrContact=[[NSMutableArray alloc] init];

    for (int i=0;i<[arrTemp count];i++)
    {
        NSMutableDictionary *dicContact=[[NSMutableDictionary alloc] init];
        NSString *str=(NSString *) ABRecordCopyValue([arrTemp objectAtIndex:i], kABPersonFirstNameProperty);
        @try
        {
            [dicContact setObject:str forKey:@"name"];
        }
        @catch (NSException * e) {
            [dicContact release];
            continue;
        }
        [arrContact addObject:dicContact];
        [dicContact release];
    }

    NSLog(@"arrContact===%@",arrContact);

我还使用了另外一个代码来尝试另一种方式,它在示例中对我来说也运行良好。

CFErrorRef *error = NULL;
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
    CFIndex numberOfPeople = ABAddressBookGetPersonCount(addressBook);

    for(int i = 0; i < numberOfPeople; i++) {

        ABRecordRef person = CFArrayGetValueAtIndex( allPeople, i );

        NSString *firstName = (NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty));
        NSString *lastName = (NSString *)(ABRecordCopyValue(person, kABPersonLastNameProperty));
        NSLog(@"Name:%@ %@", firstName, lastName);

        ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);

        //NSLog(@"\n%@\n", [[UIDevice currentDevice] name]);

        for (CFIndex i = 0; i < ABMultiValueGetCount(phoneNumbers); i++)
        {
            NSString *phoneNumber = (NSString *) ABMultiValueCopyValueAtIndex(phoneNumbers, i);

            NSLog(@"phoneNumber======%@",phoneNumber);
        }
    }

它们在模拟器上运行良好,但当我在设备上运行这些代码时,奇怪的是,有时它们不会提供联系方式,但大多数时候它们运行良好。我的编码有什么问题吗?

当我在主应用程序中使用此演示代码时,此代码永远不会响应。我是否需要在设备中针对不同应用程序执行任何权限或任何设置?

另外,当我使用 CFIndex numberOfPeople = ABAddressBookGetPersonCount(addressBook); 来获取人数,然后它给我值 11,但我在模拟器上只使用了五个联系人,当我使用 CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook); 然后我得到重复值(以满足 5 个联系人中的 11 个计数)。

有人可以告诉我这里出了什么问题吗?

最佳答案

从 iOS6 开始,您需要用户权限才能访问地址簿中的联系人。您也没有请求许可。可能是因为您没有获得联系方式。我在我的应用程序中使用了这段代码(由其他人编写)

 + (BOOL)getAccessPermission
{
    __block BOOL accessGranted = NO;
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
    if (ABAddressBookRequestAccessWithCompletion != NULL) { // we're on iOS 6
        dispatch_semaphore_t sema = dispatch_semaphore_create(0);
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
            accessGranted = granted;
            dispatch_semaphore_signal(sema);
        });
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
        dispatch_release(sema);
    }
    else
    { // we're on iOS 5 or older
        accessGranted = YES;
    }
    return accessGranted;
}

关于ios - 从 iOS SDK 获取 iPhone 联系人时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20239499/

相关文章:

ios - 如何使用 makehuman、blender 和 PVRShaman 在 Cocos3d 中正确显示 3d 模型?

ios - iPhone - PRFRelation 不保存对象

ios - 获取 UIWebView 的选定文本

ios - 具有自动调整单元格 (estimatedSize) 和 sectionHeadersPinToVisibleBounds 的 UICollectionView 变得精神起来

ios - 尝试为多个 View Controller 设置 Firebase 身份验证时出错

ios - iOS 6 上的 Facebook SDK 3.1.1 登录但 token 立即过期

objective-c - ios从应用程序内部更改应用程序的通知

objective-c - objective-c : Initializing static variable with static method call

swift - Xcode 10 中图像资源的本地化

iphone - 为什么 Xcode 的自动完成总是认为我的属性是 int?