【问题标题】:Issue in fetching iPhone contacts from iOS SDK从 iOS SDK 获取 iPhone 联系人的问题
【发布时间】:2013-12-12 22:04:13
【问题描述】:

我正在我的应用程序中获取 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 个计数)。

谁能告诉我这里发生了什么事?

【问题讨论】:

    标签: ios iphone xcode ios6 xcode5


    【解决方案1】:

    从 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;
    }
    

    【讨论】:

    • 谢谢我实际上错过了这部分。我必须在数组中获取手机号码,该号码应该位于另一个数组中名称的特定位置,但是当我使用上面的代码时它会发生变化。你能告诉我如何获取与其名称对应的用户数。
    • 您对我在问题中提出的其他问题有任何线索吗?
    • 我从来没有直接使用过通讯录方法。我使用了包装器ABContactHelper。这是非常容易使用。您不必为 ABAddressBook c api 烦恼。
    • Anil,如何使用此代码.. 我面临同样的问题
    • @MssiOS 你的问题到底是什么?它的 ObjectiveCe 代码。使用的是 ObjC 还是 Swift?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多