IOS開發 手機聯繫人獲取與使用ABAddressBookRef

IOS提供了直接獲取手機聯繫人信息的API,我們需要導入該包addressbook.framework;此包並沒有包含在corefoundation.framework裏;

而我們通常使用的是Foundation庫,這輛個庫的區別就是CoreFoundation庫是一個C框架,但是這兩個庫裏的內容是可以簡單的進行轉換的,

比如:CFString cstr = (CFString)@"NSStringTest";NSDate *date = (NSDate *)cfdate;CoreFoundation裏也有類似retain和release的方法,CFRetain和CFRelease。

首先介紹幾個類:

1:ABAddressBookRef:ABAddressBookRef像一個管理員,使用過Sqlite的朋友都知道Sqlite3對象的作用,可以說ABAddressBookRef實例的作用和sqlite3的實例的性質一樣,都類似一個管理者,來管理這個通訊錄,並給你提供一個訪問通訊錄的通道,並執行保存操作。初始化一個ABAddressBookRef的實例ABAddressBookCreate( )。

2:ABRecordRef:記錄。一個屬性的集合。類似通訊錄中一個個的人,它包含這個人的所有屬性,比如First and Last name,圖片信息,電話號碼,郵箱等等。初始化一個ABRecordRef的方法就是:ABRecordRef person = ABPersonCreate();

我們需要的信息主要包含在下面這2個類種:

1:ABPerson 聯繫人信息,包含姓名,電話號碼,地址信息,照片等

2:ABGroup   聯繫人分組信息,包含組名,數量等

最後說明:

1:返回值使用CoreFoundation是一樣的:可以認爲CFString*=NSString,CFArray*=NSArray,ABMultiValueRef*=Dictionary,CFError*=NSError等等,這些都可以互相轉換

2:返回聯繫人屬性分爲兩種:一種是擁有唯一值的屬性比如姓名,生日,性別等一般用CFString返回,一種是多值屬性比如電話號碼,地址等一般用ABMultiValue*等返回。

3:常使用的方法和宏:

ABRecordRef record=CFArrayGetValueAtIndex(CFArr,0);實際上和NSArr類似;

ABMultiValueRef mulitValue=ABRecordCopyValue(record,kABPersonPhoneProperty);獲取電話號碼,可能回多個;

像上面kABPersonPhoneProperty這種宏有許多,可以用來取名kABPersonFirstNameProperty,取公司kABPersonOrganizationProperty等等。

常用情景:

    ABAddressBookRef address=ABAddressBookCreate();//讀取手機通訊錄
    CFArrayRef allperson =ABAddressBookCopyArrayOfAllPeople(addressBook);//取全部聯繫人
    NSArray * persons=(NSArray*)ABAddressBookCopyPeopleWithName(address,CFStringRef);//取指定姓名的聯繫人

一:添加聯繫人

    ABAddressBookRef iPhoneAddressBook = ABAddressBookCreate();//初始化
    ABRecordRef newPerson = ABPersonCreate();
    CFErrorRef error = NULL;
    ABRecordSetValue(newPerson, kABPersonFirstNameProperty, firsrName, &error);//以下幾行設置用戶基本屬性,姓名,公司
    ABRecordSetValue(newPerson, kABPersonLastNameProperty, lastName, &error);
    ABRecordSetValue(newPerson, kABPersonOrganizationProperty, organization, &error);
    ABRecordSetValue(newPerson, kABPersonFirstNamePhoneticProperty, firstNamePhonetic, &error);
    ABRecordSetValue(newPerson, kABPersonLastNamePhoneticProperty, lastNamePhonetic, &error);
    ABMutableMultiValueRef multiPhone = ABMultiValueCreateMutable(kABMultiStringPropertyType);//號碼可以是多個,用了多值屬性
    ABMultiValueAddValueAndLabel(multiPhone, homeFAX, kABPersonPhoneHomeFAXLabel, NULL);
    ABMultiValueAddValueAndLabel(multiPhone, mobile, kABPersonPhoneMobileLabel, NULL);
    ABRecordSetValue(newPerson, kABPersonPhoneProperty, multiPhone, &error);
    CFRelease(multiPhone);
    ABMutableMultiValueRef multiEmail = ABMultiValueCreateMutable(kABMultiStringPropertyType);//郵件可以是多個,用了多值屬性
    ABMultiValueAddValueAndLabel(multiEmail, email, kABWorkLabel, NULL);
    ABRecordSetValue(newPerson, kABPersonEmailProperty, multiEmail, &error);
    CFRelease(multiEmail);
    NSData *dataRef = UIImagePNGRepresentation(headImage);//設置頭像
    ABPersonSetImageData(newPerson, (CFDataRef)dataRef, &error);
    ABAddressBookAddRecord(iPhoneAddressBook, newPerson, &error);
    ABAddressBookSave(iPhoneAddressBook, &error);
    CFRelease(newPerson);  
    CFRelease(iPhoneAddressBook);

二:刪除聯繫人

    CFErrorRef error = NULL;
    ABRecordRef deletedPeople = ABAddressBookGetPersonWithRecordID(addressBook, recordID);
    if (deletedPeople) {
        ABAddressBookRemoveRecord(addressBook, deletedPeople, &error);
        ABAddressBookSave(addressBook, &error);
    }

三:獲取分組信息
    CFArrayRef array = ABAddressBookCopyArrayOfAllGroups(address);
    for (id group in (NSArray *)array) {
        NSLog(@"group name = %@", ABRecordCopyValue(group, kABGroupNameProperty));
        NSLog(@"group id = %d", ABRecordGetRecordID(group));
    }
四:刪除分組信息
    ABRecordRef deletedGroup = ABAddressBookGetGroupWithRecordID(address, RecordID);
    ABAddressBookRemoveRecord(address, deletedGroup, nil);
    ABAddressBookSave(address, nil);
五:添加分組信息
    ABRecordRef  newGroup = ABGroupCreate();
    ABRecordSetValue(newGroup, kABGroupNameProperty, groupName, nil);
    ABAddressBookAddRecord(address, newGroup, nil);
    ABAddressBookSave(address, nil);
六:常用基本屬性

    CFArrayRef allperson =ABAddressBookCopyArrayOfAllPeople(addressBook);
    for (id person in (__bridge NSArray *)allperson) {
        ABMultiValueRef cfphone = ABRecordCopyValue((__bridge ABRecordRef)person, kABPersonPhoneProperty);
        //獲取firstname
        NSString *personName = (NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);
        //獲取lastname kABPersonLastNameProperty
        //獲取middlename kABPersonMiddleNameProperty
        //獲取前綴 kABPersonPrefixProperty
        //獲取後綴 kABPersonSuffixProperty
        //獲取暱稱 kABPersonNicknameProperty
        //獲取firstname拼音音標 kABPersonFirstNamePhoneticProperty
        //獲取lastname拼音音標  kABPersonLastNamePhoneticProperty
        //獲取middlename拼音音標 kABPersonMiddleNamePhoneticProperty
        //獲取organization公司 kABPersonOrganizationProperty
        //獲取jobtitle工作 kABPersonJobTitleProperty
        //獲取department部門 kABPersonDepartmentProperty
        //獲取birthday生日 kABPersonBirthdayProperty
        //獲取note備忘錄 kABPersonNoteProperty
        //第一次添加該條記錄的時間 kABPersonCreationDateProperty
        //最後一次修改該條記錄的時間  kABPersonModificationDateProperty
        
        
        //獲取照片
        NSData *image = (NSData*)ABPersonCopyImageData(person);
        UIImageView *myImage = [[UIImageView alloc] initWithFrame:CGRectMake(200, 0, 50, 50)];
        [myImage setImage:[UIImage imageWithData:image]];
        //==================以下是多值獲取=========================
        //獲取email多值
        ABMultiValueRef email = ABRecordCopyValue(person, kABPersonEmailProperty);
        int emailcount = ABMultiValueGetCount(email);
        for (int i = 0; i < emailcount; i++)
        {
            //獲取email類型 Label
            NSString* emailLabel = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(email, i));
            //獲取email值
            NSString* emailContent = (NSString*)ABMultiValueCopyValueAtIndex(email, i);
        }
        //獲取地址多值
        ABMultiValueRef address = ABRecordCopyValue(person, kABPersonAddressProperty);
        int count = ABMultiValueGetCount(address);
        
        for(int j = 0; j < count; j++)
        {
            //獲取地址類型Label
            NSString* addressLabel = (NSString*)ABMultiValueCopyLabelAtIndex(address, j);
            //獲取該label下的地址6屬性
            NSDictionary* personaddress =(NSDictionary*) ABMultiValueCopyValueAtIndex(address, j);
            NSString* country = [personaddress valueForKey:(NSString *)kABPersonAddressCountryKey];
            NSString* city = [personaddress valueForKey:(NSString *)kABPersonAddressCityKey];
            NSString* state = [personaddress valueForKey:(NSString *)kABPersonAddressStateKey];
            NSString* street = [personaddress valueForKey:(NSString *)kABPersonAddressStreetKey];
            NSString* zip = [personaddress valueForKey:(NSString *)kABPersonAddressZIPKey];
            NSString* coutntrycode = [personaddress valueForKey:(NSString *)kABPersonAddressCountryCodeKey];
        }
        
        //獲取dates多值
        ABMultiValueRef dates = ABRecordCopyValue(person, kABPersonDateProperty);
        int datescount = ABMultiValueGetCount(dates);
        for (int k = 0; k < datescount; k++)
        {
            //獲取dates Label
            NSString* datesLabel = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(dates, k));
            //獲取dates值
            NSString* datesContent = (NSString*)ABMultiValueCopyValueAtIndex(dates, k);
        }
        //獲取kind值
        CFNumberRef recordType = ABRecordCopyValue(person, kABPersonKindProperty);
        if (recordType == kABPersonKindOrganization) {
            // it's a company
        } else {
            // it's a person, resource, or room
        }
        
        
        //獲取IM多值
        ABMultiValueRef instantMessage = ABRecordCopyValue(person, kABPersonInstantMessageProperty);
        for (int l = 1; l < ABMultiValueGetCount(instantMessage); l++)
        {
            //獲取IM類型 Label
            NSString* instantMessageLabel = (NSString*)ABMultiValueCopyLabelAtIndex(instantMessage, l);
            //獲取該label下的2屬性
            NSDictionary* instantMessageContent =(NSDictionary*) ABMultiValueCopyValueAtIndex(instantMessage, l);
            NSString* username = [instantMessageContent valueForKey:(NSString *)kABPersonInstantMessageUsernameKey];
            NSString* service = [instantMessageContent valueForKey:(NSString *)kABPersonInstantMessageServiceKey];
        }
        
        //獲取電話多值
        ABMultiValueRef phone = ABRecordCopyValue(person, kABPersonPhoneProperty);
        for (int m = 0; m<ABMultiValueGetCount(phone); m++)
        {
            //獲取電話Label類型
            NSString * personPhoneLabel = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(phone, m));
            //獲取該Label下的電話值
            NSString * personPhone = (NSString*)ABMultiValueCopyValueAtIndex(phone, m);
        }
        
        //獲取URL多值
        ABMultiValueRef url = ABRecordCopyValue(person, kABPersonURLProperty);
        for (int n = 0; n < ABMultiValueGetCount(url); n++)
        {
            //獲取電話Label
            NSString * urlLabel = (NSString*)ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(url, n));
            //獲取該Label下的電話值
            NSString * urlContent = (NSString*)ABMultiValueCopyValueAtIndex(url,n);
        }
    }





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