IOS - 获取联系人电话用于通讯录

标签 ios objective-c addressbook

我有一部运行 ios 6.0.1 的设备电话,我想在我的设备中获取所有联系人。我尝试在 iphone 上使用 IOS 5.1、6.1.3,它工作正常。不幸的是,当它运行 ios 6.0.1 时,数据为空

这是我的代码:

if ([[[UIDevice currentDevice] systemVersion] floatValue] > 5.2) {

    ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);
    if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined)
    {
        ABAddressBookRequestAccessWithCompletion(addressBookRef,
                                                 ^(bool granted, CFErrorRef error) {
                                                     if (granted)
                                                         [self loadContact];

                                                 });
    }
    else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized)
    {
        [self loadContact];
    }
}
else
{
    [self loadContact];
}

-(void) loadContact {

ABAddressBookRef addressBooks = ABAddressBookCreate();
allPeople = (__bridge NSArray *)(ABAddressBookCopyArrayOfAllPeople(addressBooks));
peopleCount = ABAddressBookGetPersonCount(addressBooks); }


我不知道,为什么它在 ios 6.0.1 上不起作用

我找到了this link ,然后做,但我的设备没有数据。

你能帮我解决这个问题吗?

最佳答案

您的代码中最大的问题是您需要将引用“addressBookRef”传递给您的“loadContact”方法。 “ABAddressBookCreate”不适用于 iOS6 - 您需要使用由 ABAddressBookRequestAccessWithCompletion 创建的那个。

顺便提一句。与其检查 iOS 版本,不如使用它来确定您是否需要请求权限。这是我正在使用的代码 - 随意使用它:

-(BOOL)isABAddressBookCreateWithOptionsAvailable {
    return &ABAddressBookCreateWithOptions != NULL;
}

- (void) importContactsFromAddressBook
{
    ABAddressBookRef addressBook;
    if ([self isABAddressBookCreateWithOptionsAvailable]) {
        CFErrorRef error = nil;
        addressBook = ABAddressBookCreateWithOptions(NULL,&error);
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
            // callback can occur in background, address book must be accessed on thread it was created on
                if (error) {
                    [self.delegate addressBookHelperError:self];
                } else if (!granted) {
                    [self.delegate addressBookHelperDeniedAcess:self];
                    AddressBookUpdated(addressBook, nil, self);
                } else {
                    // access granted
                    AddressBookUpdated(addressBook, nil, self);
                    CFRelease(addressBook);
                }
        });
    } else {
        // iOS 4/5
        addressBook = ABAddressBookCreate();
        AddressBookUpdated(addressBook, NULL, self);
        CFRelease(addressBook);
    }
}

void AddressBookUpdated(ABAddressBookRef addressBook, CFDictionaryRef info, void *context)
{
    NSMutableArray* addressBookContacts = [NSMutableArray array];

    //import from address book
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBook );
    CFIndex nPeople = ABAddressBookGetPersonCount( addressBook );
    [helper.delegate performSelectorOnMainThread:@selector(didLoadList:)
                                    withObject:[NSNumber numberWithInt:nPeople]
                                 waitUntilDone:YES];
    if(allPeople) CFRelease(allPeople);
    [helper.delegate performSelectorOnMainThread:@selector(didComplete:)
                                    withObject:addressBookContacts
                                 waitUntilDone:YES];
}

我将这些功能封装到类中,委托(delegate)是:
@protocol ContactImporterProgressViewDelegate <NSObject>
- (void) didLoadList:(NSNumber*) totalItems;
- (void) updateProgress:(NSNumber*) progress;
- (void) didComplete:(NSArray*) contactsImported;
@end

@property (nonatomic, assign) NSObject <ContactImporterProgressViewDelegate>* delegate;

要使用它,我建议在另一个线程上调用它以不阻塞 UI 并显示进度(当您有 5000 个条目时需要一段时间):
ContactImporter* importer = [[ContactImporter alloc] init];
importer.delegate = self;
NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
NSInvocationOperation *oper = [[[NSInvocationOperation alloc] initWithTarget:importer
                                                                   selector:@selector(importContactsFromAddressBook)
                                                                     object:nil] autorelease];
[queue addOperation:oper];
[importer release];

关于IOS - 获取联系人电话用于通讯录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18713193/

相关文章:

ios - 如果将 UDID 添加到现有配置文件,IPA 是否需要重新生成?

ios - 如何在 Appstore 中以(付费) "$1"成本上传 iPhone 应用程序

ios - 是否可以在 swift 3 的 tableview 单元格中实现 tableview?

iphone - 何时更改 UITableViewController 的数据源合适

objective-c - "Converting"指向 Objective-C 中 block 的函数指针

swift - 从通讯录中获取 kABAddressCountryCodeKey

ios - 从地址簿问题中获取号码

ios - 在特定的转场之后如何触发我的动画?

uri - 将android电话号码标签id翻译成字符串

ios - 如何保存一个姓名字符串和两个不同长度的电子邮件和电话号码数组