Swift 獲取聯(lián)系人信息

Swift 獲取聯(lián)系人信息

如今很多開發(fā)者都開始嘗試使用Swift進(jìn)行開發(fā),而且獲取手機(jī)通訊錄作為開發(fā)常見的需求
作為一個新的開發(fā)者,如果我們開發(fā)的應(yīng)用需求不是特別高,只要求是iOS9以上,
那么恭喜你,基本上你寫的很少,
你可以選擇Contacts框架,這個框架是在iOS9才出來的@available(iOS 9.0, *)
直接上代碼
首先在需要的類中

import Contacts

然后就可以使用這個框架了
首先lazy一個contactStore的對象

lazy var myContactStore: CNContactStore = {
        let cn:CNContactStore = CNContactStore()
        return cn
    }()

首先是檢測權(quán)限,如果沒有授權(quán)就要申請權(quán)限,有權(quán)限則直接獲取通訊錄,沒有權(quán)限可以選擇彈窗是否需要重新開啟權(quán)限

func checkContactStoreAuth(){
        switch CNContactStore.authorizationStatus(for: .contacts) {
        case .notDetermined:
            print("未授權(quán)")
            requestContactStoreAuthorization(myContactStore)
        case .authorized:
            print("已授權(quán)")
            readContactsFromContactStore(myContactStore)
        case .denied, .restricted:
            print("無權(quán)限")
        //可以選擇彈窗到系統(tǒng)設(shè)置中去開啟
        default: break
        }
    }

請求權(quán)限

func requestContactStoreAuthorization(_ contactStore:CNContactStore) {
        contactStore.requestAccess(for: .contacts, completionHandler: {[weak self] (granted, error) in
            if granted {
                print("已授權(quán)")
                self?.readContactsFromContactStore(contactStore)
            }
        })
    }

讀取通訊錄

func readContactsFromContactStore(_ contactStore:CNContactStore) {
        guard CNContactStore.authorizationStatus(for: .contacts) == .authorized else {
            return
        }
        
        let keys = [CNContactFamilyNameKey,CNContactGivenNameKey,CNContactPhoneNumbersKey]
        
        let fetch = CNContactFetchRequest(keysToFetch: keys as [CNKeyDescriptor])
        do {
            try contactStore.enumerateContacts(with: fetch, usingBlock: { (contact, stop) in
                //姓名
                let name = "\(contact.familyName)\(contact.givenName)"
                print(name)
                //電話
                for labeledValue in contact.phoneNumbers {
                    let phoneNumber = (labeledValue.value as CNPhoneNumber).stringValue
                    print(phoneNumber)
                }
            })
        } catch let error as NSError {
            print(error)
        }
    }

OK 以上就是iOS9以上的獲取方式
對于iOS9以下的話就沒有那么方便了
我們只能使用iOS早期的一個AddressBook框架了
一樣的 首先import AddressBook
然后加載一個通訊錄對象

private lazy var myAddressBook: ABAddressBook = {
        var error:Unmanaged<CFError>?
        let ab: ABAddressBook = ABAddressBookCreateWithOptions(nil, nil).takeRetainedValue()
        return ab;
    }()

注意這里之所以使用lazy加載,是因?yàn)檎{(diào)用ABAddressBookCreateWithOptions進(jìn)行ABAddressBookCreateWithOptions的初始化需要設(shè)置為一個lazy變量樱衷,否則在用戶拒絕授權(quán)的情況下,程序?qū)罎⒓婪埂R驗(yàn)锳BAddressBookCreateWithOptions(nil, nil)得到的值為nil
所以這里一定要注意

之后也大致是同樣的方式
檢測權(quán)限

func checkAddressBookAuth() {
        switch ABAddressBookGetAuthorizationStatus() {
        case .notDetermined:
            print("未授權(quán)")
            requestAddressBookAuthorization(myAddressBook)
        case .authorized:
            print("已授權(quán)")
            readContactsFromAddressBook(myAddressBook)
        case .denied, .restricted:
            print("無權(quán)限")
            //可以選擇彈窗到系統(tǒng)設(shè)置中去開啟
        }
    }

申請權(quán)限

func requestAddressBookAuthorization(_ addressBook:ABAddressBook) {
        ABAddressBookRequestAccessWithCompletion(addressBook, {[weak self] (granted, error) in
            if granted {
                print("已授權(quán)")
                self?.readContactsFromAddressBook(addressBook)
            }
        })
    }

讀取通訊錄

func readContactsFromAddressBook(_ addressBook:ABAddressBook) {
        guard ABAddressBookGetAuthorizationStatus() == .authorized else {
            return
        }
        
        let allContacts = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as Array
        for record in allContacts {
            let currentContact: ABRecord = record
            let name = ABRecordCopyCompositeName(currentContact).takeRetainedValue() as String
            print(name)
            
            let currentContactPhones: ABMultiValue = ABRecordCopyValue(currentContact, kABPersonPhoneProperty).takeRetainedValue() as ABMultiValue
            for i in 0..<ABMultiValueGetCount(currentContactPhones){
                let phoneNumber = ABMultiValueCopyValueAtIndex(currentContactPhones, i).takeRetainedValue() as! String
                print(phoneNumber)
            }
        }
    }

至于如何判斷采用哪一個框架

if #available(iOS 9.0, *) {
                checkContactStoreAuth()
        }else {
                checkAddressBookAuth()
        }

當(dāng)然,你還要這樣做


這里寫圖片描述

需要在info.plist中添加允許訪問通訊錄的權(quán)限,否則iOS10以上的系統(tǒng)也會導(dǎo)致崩潰

OK 至此,通訊錄大家應(yīng)該都能夠獲取到了

這是我的模擬器運(yùn)行的結(jié)果


這里寫圖片描述

附上DEMO地址:https://github.com/spicyShrimp/XLXContact

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凛俱,一起剝皮案震驚了整個濱河市仅讽,隨后出現(xiàn)的幾起案子逻杖,更是在濱河造成了極大的恐慌,老刑警劉巖嚼酝,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驼抹,死亡現(xiàn)場離奇詭異桑孩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)框冀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門流椒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人明也,你說我怎么就攤上這事宣虾」咴#” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵安岂,是天一觀的道長轻猖。 經(jīng)常有香客問我,道長域那,這世上最難降的妖魔是什么咙边? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮次员,結(jié)果婚禮上败许,老公的妹妹穿的比我還像新娘。我一直安慰自己淑蔚,他們只是感情好市殷,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刹衫,像睡著了一般醋寝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上带迟,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天音羞,我揣著相機(jī)與錄音,去河邊找鬼仓犬。 笑死嗅绰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的搀继。 我是一名探鬼主播窘面,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼叽躯!你這毒婦竟也來了财边?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤险毁,失蹤者是張志新(化名)和其女友劉穎制圈,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畔况,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年慧库,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了跷跪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡齐板,死狀恐怖吵瞻,靈堂內(nèi)的尸體忽然破棺而出葛菇,到底是詐尸還是另有隱情,我是刑警寧澤橡羞,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布眯停,位于F島的核電站,受9級特大地震影響卿泽,放射性物質(zhì)發(fā)生泄漏莺债。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一签夭、第九天 我趴在偏房一處隱蔽的房頂上張望齐邦。 院中可真熱鬧,春花似錦第租、人聲如沸措拇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丐吓。三九已至,卻和暖如春趟据,著一層夾襖步出監(jiān)牢的瞬間券犁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工之宿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留族操,地道東北人。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓比被,卻偏偏與公主長得像色难,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子等缀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容