第一步:獲取授權,在viewDidLoad 里面寫一下的代碼
//新通訊錄獲得授權方法
//用新的方法獲取通訊錄信息,首先獲取 store
var store = CNContactStore()
let status? = CNContactStore.authorizationStatusForEntityType(.Contacts)
if status == CNAuthorizationStatus.NotDetermined{
print("requesting access")
self.store.requestAccessForEntityType(CNEntityType.Contacts,completionHandler: { (result, error) -> Void in
if result == true{
print("已授權")
//獲取并遍歷所有聯系人記錄
self.readRecord()
self.fetchContactList()
dispatch_async(dispatch_get_main_queue(), { () -> Void in
//gContactViewController?.contactTableView.reloadData()
self.listTableView.reloadData()
})
}else{
print("error")
}
})
}
else if (status == CNAuthorizationStatus.Denied){
print("access denied")
}
else if (status == CNAuthorizationStatus.Authorized){
self.readRecord()
self.fetchContactList()
}
// 第二步,接下來,是readRecord() 函數的實現,主要用于獲取數據,并加以封裝
func readRecord() {
//獲取Contacts方法
let store = CNContactStore()
let keysToFetch =? [CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName),CNContactImageDataKey,CNContactPhoneNumbersKey]
let fetchRequest = CNContactFetchRequest(keysToFetch: keysToFetch)
var contacts = [CNContact]()
do {
try store.enumerateContactsWithFetchRequest(fetchRequest, usingBlock: { (let contact, let stop) -> Void in
contacts.append(contact)
})
//try contacts = store.unifiedContactsMatchingPredicate(predicate, keysToFetch: keys)
}
catch let error as NSError {
print(error.localizedDescription)
}
print("contacts accounts is\(contacts.count)")
for contact in contacts {
var i = 0
//獲取本地通訊錄頭像數據
var imageData: NSData = NSData()
if (contact.isKeyAvailable(CNContactImageDataKey) == true){
if contact.imageData != nil{
imageData = contact.imageData!
}
}
//獲取姓名
let name = CNContactFormatter.stringFromContact(contact, style: .FullName) as String? ?? ""
//獲取姓名拼音
var nameSpell:String = name.pinYin()
if nameSpell == ""{
nameSpell = "#"
}
//獲取電話號碼
let tempphone = contact.phoneNumbers.first?.value as? CNPhoneNumber
var phone = tempphone?.stringValue
if? phone == nil
{
phone = " "
}
//獲取本地通訊錄頭像圖片
var image: UIImage?
if imageData.length != 0 {
image = UIImage.init(data: imageData)
}else{
image = nil
}
//如果沒有頭像,本地通訊錄沒有頭像,則默認給一個頭像
var avatar_url: String = ""
avatar_url = "http://ww2.sinaimg.cn/large/6a011e49jw1f18hkv6i5kj20300303yb.jpg"
//把拿到的數據放到contactModelArray 里面
let model = ContactModel()
model.avatarSmallURL = avatar_url
model.nameSpell = nameSpell
model.chineseName = name
model.imageIco = image
model.phone = phone
contactModelArray.insertObject(model, atIndex: i)
print("contactModelArrays is\(contactModelArray.count)")
contactDic = ["name":name, "phone":phone!,"avatar_url":avatar_url,"name_spell":nameSpell]
contactArray.insertObject(contactDic!, atIndex: i)
i = i+1
}
}
通過這兩步就可以輕松拿到數據了。因為fetchContactList() 是自己根據自己業務邏輯寫的,比較復雜就不貼出來了。有需要的可以聯系我。下面就放出效果圖吧。