iOS初級開發之獲取通訊錄

前言

作爲剛入行不久的菜鳥,我想大多數人遇到問題都是第一時間上各種論壇蒐集關於自己遇到問題的帖子,當然我也是,前段時間公司項目有個需求是獲取手機通訊錄的,剛接手的時候整個人就是很懵的那種狀態.但是爲了不影響項目進度,我立馬百度搜各種大神寫的.然,大神的代碼肯定是第一時間難以看懂的,最後把各種代碼看了一次之後,我將代碼總結爲一下的關鍵代碼段.少說廢話了,直接貼代碼

一、步驟:

  1. 導入框架AddressBook.framework(下圖1)
  2. 必須導入頭文件 #import < AddressBook/AddressBook.h >
  3. 由於現在iOS版本升級爲10.0,所以現在獲取通訊錄必須在項目工程設置裏面添加獲取權限的相關配置(如下圖2)
    添加框架

添加訪問權限

二、關鍵代碼

- (NSArray *)getAddressBook
{
    ABAddressBookRef addressBook = nil;
    NSMutableArray *array = [NSMutableArray array];
//進行版本判斷
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0) {
        addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

        //獲取通訊錄權限 
        dispatch_semaphore_t sema = dispatch_semaphore_create(0);
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
            dispatch_semaphore_signal(sema);
        });
        dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    }
    else
    {
        addressBook = ABAddressBookCreate();
    }

    //獲取通訊錄所有人
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);

    //通訊錄中人數
    CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);

    //for循環獲取每個人的信息
    for (NSInteger i = 0; i < nPeople; i++)
    {
        //新建一個addressBook model類
        DWEAddressBook *addressBook = [[DWEAddressBook alloc] init];
        //獲取個人
        ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
        //獲取個人名字
        CFTypeRef abName = ABRecordCopyValue(person, kABPersonFirstNameProperty);
        CFTypeRef abLastName = ABRecordCopyValue(person, kABPersonLastNameProperty);
        CFStringRef abFullName = ABRecordCopyCompositeName(person);
        NSString *nameString = (__bridge NSString *)abName;
        NSString *lastNameString = (__bridge NSString *)abLastName;

        if ((__bridge id)abFullName != nil)
        {
            nameString = (__bridge NSString *)abFullName;
        }
        else
        {
            if ((__bridge id)abLastName != nil)
            {
                nameString = [NSString stringWithFormat:@"%@ %@", nameString, lastNameString];
            }
        }
<span style="white-space:pre">  </span>//聯繫人名稱
        addressBook.name = nameString;
<span style="white-space:pre">  </span>addressBook.recordId = (int)ABRecordGetRecordID(person);;

        ABPropertyID multiProperties[] = {
            kABPersonPhoneProperty,
            kABPersonEmailProperty
        };
        NSInteger multiPropertiesTotal = sizeof(multiProperties) / sizeof(ABPropertyID);
        for (NSInteger j = 0; j < multiPropertiesTotal; j++)
        {
            ABPropertyID property = multiProperties[j];
            ABMultiValueRef valuesRef = ABRecordCopyValue(person, property);
            NSInteger valuesCount = 0;
            if (valuesRef != nil) valuesCount = ABMultiValueGetCount(valuesRef);

            if (valuesCount == 0)
            {
                CFRelease(valuesRef);
                continue;
            }
            //獲取電話號碼和email
            for (NSInteger k = 0; k < valuesCount; k++)
            {
                CFTypeRef value = ABMultiValueCopyValueAtIndex(valuesRef, k);
                switch (j)
                {
                    case 0:
                    {// Phone number
                        addressBook.phone = (__bridge NSString*)value;
                        break;
                    }
                    case 1:
                    {// Email
                        addressBook.email = (__bridge NSString*)value;
                        break;
                    }
                }
                CFRelease(value);
            }
            CFRelease(valuesRef);
        }
        //獲取回來的原始數據格式爲:+86-100-003-0000下面是對原始數據進行一個過濾
        //過濾除數字以外的符號
        NSCharacterSet *charaterSet = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789"]invertedSet];
        NSString *phone = [[addressBook.phone componentsSeparatedByCharactersInSet:charaterSet]componentsJoinedByString:@""];
        addressBook.phone = phone;

        //將個人信息添加到數組中,循環完成後addressBookTemp中包含所有聯繫人的信息
        [array addObject:addressBook];
        if (abName)     CFRelease(abName);
        if (abLastName) CFRelease(abLastName);
        if (abFullName) CFRelease(abFullName);
    }
    if(allPeople)   CFRelease(allPeople);
    if(addressBook) CFRelease(addressBook);
    return array;
}

三、項目鏈接:

休閒咖-2千萬人的技能分享平臺,人人都可以參與,適合每一種職業.
分享是一種生活,也是一種收穫. 分享技能,傳遞價值,改變世界,從我開始。我們期待你的加入。
安卓app下載鏈接:
http://sj.qq.com/myapp/detail.htm?apkName=com.alligator.xiuxianba
蘋果app下載鏈接:
https://itunes.apple.com/cn/app/xiu-xian-ka/id1160649870?mt=8

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章