iOS9-Contacts本地電話本框架

閑來無事,翻翻老代碼發現AddressBook框架已經被棄用了,然后才發現iOS9就已經被Contacts框架所替代,請原諒我的后知后覺,幸虧方法向下兼容,沒有引起問題

先看一下Contacts框架的一些類目
CNContactStore:聯系人的存儲庫。
CNSaveRequest:保存聯系人。
CNContainer:聯系人容器。
CNGroup:聯系人分組。
CNMutableGroup:修改聯系人分組時使用。
CNContactFetchRequest:快速獲取聯系人。
CNContact:聯系人
CNMutableContact:要修改聯系人的信息時使用。
CNContactProperty:聯系人的相關屬性
CNLabeledValue:聯系人的相關屬性對應的值。
CNContactRelation:聯系人關聯其他聯系人。
CNContactVCardSerialization:名片
CNContactsUserDefaults:默認聯系人
CNInstantMessageAddress:聯系人地址
CNPhoneNumber:電話號碼
CNPostalAddress:郵政地址。
CNMutablePostalAddress:修改郵政地址時使用。
CNSocialProfile:社會現象(不知道干嘛用的,希望那個知道的大神可以告知)
CNContactFormatter:格式化獲取聯系人相關信息。
CNPostalAddressFormatter:格式化獲取聯系人地址
就這么一些屬性看的真是心頭大暢,比起來AddressBook真的感覺邏輯清晰了很多。
因為我用到的地方并不多,時間多很多方法都沒有看,我只是看了一些常用的。
一、判斷系統權限

switch ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts])  
        {  
            case  CNAuthorizationStatusNotDetermined:  
            case  CNAuthorizationStatusAuthorized:  
                // 用戶還沒有決定是否授權你的程序進行訪問  
                return YES;  
                break;  
            case  CNAuthorizationStatusDenied:  
            case  CNAuthorizationStatusRestricted:  
                // iOS設備上的家長控制或其它一些許可配置阻止程序  
                return NO;  
                break;  
            default:  
                return YES;  
                break;  
        }  ```

二、添加聯系人

CNMutableContact * contact = [[CNMutableContact alloc]init];//新建一個聯系人
contact.givenName = @"12345";//givenName只是其中的一個屬性,還包含郵箱、地址、姓、名、手機號碼數組等多有的聯系人屬性都可以自己在api文件里邊找一個

//需要注意phoneNumbers是一個數組,因為一個人可以有多個手機號碼,所以是數組。其中的WithLabel就是每一個號碼前邊對應的號碼標簽,iOS10之前有的軟件的騷擾號碼識別就是通過此標簽實現的,具體自行百度
contact.phoneNumbers =@[[CNLabeledValue labeledValueWithLabel:@"標簽" value:[CNPhoneNumber phoneNumberWithStringValue:@"手機號碼"]]];
//初始化存儲方法 這個在我的理解就是類似于網絡請求的請求體,如果我理解有錯,請指正
CNSaveRequest * saveRequest = [[CNSaveRequest alloc]init];
[saveRequest addContact:contact toContainerWithIdentifier:nil];
//將聯系人存到本地
CNContactStore * store = [[CNContactStore alloc]init];
[store executeSaveRequest:saveRequest error:nil];


二、查找聯系人

在AddressBook框架中查找聯系人,需要對本地取出來的Address進行遍歷才可以知道這個聯系人是不是存在本地,比較耗費空間和時間。但是Contacts框架對于這一問題有了新的優化方式,引入了NSPredicate來進行查找聯系人。  

CNContactStore *con = [[CNContactStorealloc]init];//初始化存儲庫類
NSPredicate *pre = [CNContactpredicateForContactsMatchingName:phoneNum];//新建一個謂詞,這個謂詞不同于以前的維持語言,這個是API封裝好的
//這是通過我謂詞傳入的字符串,搜索PhoneNumbers,同理keysToFetch還可以選擇姓名和其他的key
NSArray *arr = [con unifiedContactsMatchingPredicate:prekeysToFetch:@[CNContactPhoneNumbersKey]error:nil];
//返回的數組里邊包含的對象是CNContact
重點說一下,因為我謂詞過濾每一個聯系人的PhoneNumbers是否包含我要找的聯系人,所以返回的CNContact只會包含聯系人的姓名和PhoneNumbers,不會包含其他的屬性值,所以你如果需要什么值,就需要在keysToFetch中的數組添加其他的key ```

二、獲取全部的聯系人

CNContactStore *store2=[[CNContactStore alloc]init];  
    CNContactFetchRequest *request=[[CNContactFetchRequest alloc]initWithKeysToFetch:@[CNContactGivenNameKey]];  
    [store2 enumerateContactsWithFetchRequest:request error:nil usingBlock:^(CNContact * _Nonnull contact, BOOLBOOL * _Nonnull stop) {  
        NSLog(@"store-->%@",contact);  
    }];  

CNContactStore就不再重復說了,剛才說過了。這個ToFetch跟上邊一樣,你的key數組里邊包含什么key就給你返回什么,不包含就不返回。block遍歷返回你的聯系人,個人猜測底層應該也是一個異步并行隊列來跑,但是比起來AddressBook

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容