【问题标题】:get all iphone Contact in ios Application with iOS 7使用 iOS 7 获取 ios 应用程序中的所有 iphone 联系人
【发布时间】:2015-11-18 17:44:35
【问题描述】:

我正在开发一个应用程序,我想从我的 iphone 中获取所有联系人,包括详细信息(名字、姓氏、电子邮件和手机号码)。应用程序的部署目标是 iOS 7 及更高版本。

我尝试了下面的代码,但它根本不起作用。

我的代码在这里

__block NSMutableArray *myContacts = [[NSMutableArray alloc]init];

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

    __block BOOL userDidGrantAddressBookAccess;
    CFErrorRef addressBookError = NULL;

    if ( ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined ||
        ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized )
    {
        addressBook = ABAddressBookCreateWithOptions(NULL, &addressBookError);
        dispatch_semaphore_t sema = dispatch_semaphore_create(0);
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)
        {
            userDidGrantAddressBookAccess = granted;
            dispatch_semaphore_signal(sema);
            if (addressBook!=nil)
            {
                NSArray *allContacts = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);

                NSUInteger i = 0;
                for (i = 0; i<[allContacts count]; i++)
                {
                                        ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i];
                    NSString *firstName = (__bridge_transfer NSString*)ABRecordCopyValue(contactPerson, kABPersonFirstNameProperty);


                    [myContacts addObject:firstName];
                }
                CFRelease(addressBook);

            }
            else
            {
                NSLog(@"Error");

            }
        });
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    }
    else
    {
        if ( ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusDenied ||
            ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusRestricted )
        {
            NSLog(@"denied");
            // Display an error.
        }
    }

    NSLog(@"%@", myContacts);

【问题讨论】:

    标签: ios objective-c contacts abaddressbook


    【解决方案1】:

    您的代码几乎完全正确。您只需在地址簿请求的完成块中打印出您的myContacts 数组。

    我已经为你做了一些代码更改:

    __block NSMutableArray *myContacts = [[NSMutableArray alloc]init];
    
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
    
    __block BOOL userDidGrantAddressBookAccess;
    CFErrorRef addressBookError = NULL;
    
    if ( ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined ||
        ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized )
    {
        addressBook = ABAddressBookCreateWithOptions(NULL, &addressBookError);
        dispatch_semaphore_t sema = dispatch_semaphore_create(0);
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
         userDidGrantAddressBookAccess = granted;
         dispatch_semaphore_signal(sema);
         if (addressBook!=nil)
         {
             NSArray *allContacts = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);
    
             NSUInteger i = 0;
             for (i = 0; i<[allContacts count]; i++)
             {
                 ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i];
                 NSString *firstName = (__bridge_transfer NSString*)ABRecordCopyValue(contactPerson, kABPersonFirstNameProperty);
    
                 // you need to do a nil check before adding a firstName to the array
                 //
                 // some contacts won't have first names, after all
                 if([firstName length] > 0)
                 {
                     [myContacts addObject:firstName];
                 }
             }
             CFRelease(addressBook);
         }
         else
         {
             NSLog(@"Error");
         }
    
         // *** HERE is where to print out the myContacts array***
         NSLog(@"addresses are %@", myContacts);
        });
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    }
    else
    {
        if ( ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusDenied ||
            ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusRestricted )
        {
            NSLog(@"denied");
            // Display an error.
        }
    }
    
    // don't NSLog here, as myContacts array likey won't be filled out here...
    // print it out in the completion block instead
    // NSLog(@"%@", myContacts);
    

    顺便说一句,如果您的代码只能在 iOS 9 和更高版本上运行,请考虑改用 CNContactStore,因为 AddressBook API 已被弃用,最终可能会从 iOS 中删除。

    【讨论】:

    • 请更新您的代码以获取姓氏、电子邮件和图像。
    • 既然你看到我在做什么,你能做到吗?
    • 这段代码是否适用于 ios 9 ?或者我需要通过代码检查操作系统是否为 iOS 9 或更高版本?
    • 尝试不同的问题和单独的帖子,因为我已经回答了这个问题:-)
    猜你喜欢
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 2015-01-08
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    相关资源
    最近更新 更多