iOS 通讯录访问(代码块的)

来源:互联网 发布:gdb调试linux内核 编辑:程序博客网 时间:2024/06/05 09:49

 

#import <AddressBook/AddressBook.h>  导入该框架



 //指向常量的指针

    ABAddressBookRef addressBook = nil;

    //判断当前系统的版本

    if ([[UIDevicecurrentDevice].systemVersionfloatValue] >= 6.0)

    {

        //如果不小于6.0,使用对应的api获取通讯录,注意,必须先请求用户的同意,如果未获得同意或者用户未操作,此通讯录的内容为空

        addressBook = ABAddressBookCreateWithOptions(NULL,NULL);//等待同意后向下执行//为了保证用户同意后在进行操作,此时使用多线程的信号量机制,创建信号量,信号量的资源数0表示没有资源,调用dispatch_semaphore_wait会立即等待。若对此处不理解,请参看GCD信号量同步相关内容。

        dispatch_semaphore_t sema =dispatch_semaphore_create(0);//发出访问通讯录的请求

        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted,CFErrorRef error){

            //如果用户同意,才会执行此block里面的方法

           //此方法发送一个信号,增加一个资源数

            dispatch_semaphore_signal(sema);});

        //如果之前的block没有执行,则sema的资源数为零,程序将被阻塞

        //当用户选择同意,block的方法被执行, sema资源数为1

        dispatch_semaphore_wait(sema,DISPATCH_TIME_FOREVER);

        

    }

    CFArrayRef results =ABAddressBookCopyArrayOfAllPeople(addressBook);

    //联系人条目数(使用long而不使用int是为了兼容64位)

    NSArray *persons=CFBridgingRelease(results);

    

    

    

    

    //    CFArrayRef  arrayNames=ABAddressBookCopyPeopleWithName(addressBook, <#CFStringRef name#>)

    long peopleCount = CFArrayGetCount(results);


    [persons enumerateObjectsUsingBlock:^(id _Nonnull obj,NSUInteger idx,BOOL *_Nonnull stop) {

        ABRecordRef person= (__bridgeABRecordRef)obj;

        ABMultiValueRef phoneNumbers = (ABMultiValueRef)ABRecordCopyValue(person,kABPersonPhoneProperty);

        CFIndex count = ABMultiValueGetCount(phoneNumbers);

        if (count<11) {

            

        }

        NSString *number = (__bridgeNSString*)ABMultiValueCopyValueAtIndex(phoneNumbers,0);//电话号码 可能有空格  -

        CFRelease(phoneNumbers);

     

//ABRecordCopyValue(person, kABPersonLastNameProperty) last  姓名

//ABRecordCopyValue(person,kABPersonFirstNameProperty) first  姓名

//ABRecordCopyValue(person,kABPersonMiddleNameProperty) middle  姓名


        NSString*   contactName=(__bridge NSString*)ABRecordCopyCompositeName(person);//拼合  first  middle  last//名字

    }];


0 0
原创粉丝点击