国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

swift3下通訊錄的開(kāi)發(fā)

2019-11-09 16:21:18
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

swift3下通訊錄的開(kāi)發(fā)

1:封裝一個(gè)通訊錄Manager:

iOS9之后,通訊錄用CNContactStore實(shí)現(xiàn);iOS9之前使用ABAddressBook。

讀取通訊錄的流程:

檢測(cè)授權(quán);沒(méi)有權(quán)限申請(qǐng)權(quán)限;得到權(quán)限讀取通訊錄消息。

2:開(kāi)始封裝AddressBookManger單例:

基本信息設(shè)置與實(shí)現(xiàn):

iOS10之后需要在plist文件中添加訪問(wèn)權(quán)限:key:PRivacy - Contacts Usage Description value:contactsDesciption。

mannager單例實(shí)現(xiàn):

/// 單例 class var sharedInstance: YSAddressBookManager{ struct Static { static var instance : YSAddressBookManager = YSAddressBookManager() } return Static.instance }

分別創(chuàng)建一個(gè)CNContactStore和ABAddressBook的屬性:

//注意調(diào)用ABAddressBookCreateWithOptions進(jìn)行ABAddressBookCreateWithOptions的初始化需要設(shè)置為一個(gè)lazy變量,否則在用戶(hù)拒絕授權(quán)的情況下,程序?qū)?huì)崩潰。因?yàn)锳BAddressBookCreateWithOptions(nil, nil)得到的值為nil。 lazy var addressBook:ABAddressBook = { var emptyDictionary: CFDictionary? var errorRef: Unmanaged<CFError>? let ab:ABAddressBook = ABAddressBookCreateWithOptions(emptyDictionary, &errorRef).takeRetainedValue() return ab }() @available(iOS 9.0, *) lazy var contact:CNContactStore = CNContactStore() //獲取當(dāng)前系統(tǒng)版本號(hào) lazy var current_iOS_Version:Float = { return UIDevice.current.systemVersion.floatValue }() var originalAddressData:[AddressBookObj] = [] //用于存放通訊錄里的原始有效數(shù)據(jù)創(chuàng)建一個(gè)對(duì)外的權(quán)限授權(quán)狀態(tài): //@objc如果是在OC和swift3混編的工程里,OC的類(lèi)需要使用到AddressBookAuthorizationStatus枚舉,則加上@objc,這樣就可以在OC類(lèi)里也使用,否則無(wú)需@objc標(biāo)注 @objc enum AddressBookAuthorizationStatus:Int { case deniedOrRestricted = 1 case authorized = 2 case notDeterMined = 3 }

授權(quán):

檢測(cè)授權(quán)情況

//檢測(cè)授權(quán)情況 func cheackAddressBookAuthorizationStatus()->AddressBookAuthorizationStatus { if #available(iOS 9, *) { switch CNContactStore.authorizationStatus(for: .contacts) { case .denied,.restricted: return .deniedOrRestricted case .authorized: return .authorized case .notDetermined: return .notDeterMined } }else{ switch ABAddressBookGetAuthorizationStatus() { case .denied,.restricted: //訪問(wèn)限制或者拒絕 彈出設(shè)置對(duì)話(huà)框 return .deniedOrRestricted case .authorized://已授權(quán),加載數(shù)據(jù) return .authorized case .notDetermined://從未進(jìn)行過(guò)授權(quán)操作、請(qǐng)求授權(quán) return .notDeterMined } } }

請(qǐng)求授權(quán)

//請(qǐng)求授權(quán) func requestAddressBookaccess(_ success:@escaping ((_ granted:Bool )->Void)) { if #available(iOS 9, *){ self.contact.requestAccess(for: .contacts, completionHandler: { (granted, error) in if !granted { success(false) }else{ success(true) } }) }else{ ABAddressBookRequestAccessWithCompletion(self.addressBook) {(granted, error) in if !granted { success(false) }else{ success(true) } } } }

讀取通訊錄信息:

1://謂詞表達(dá)式判斷手機(jī)號(hào)碼是否有效 func validateMobile(_ phoneNum:String)-> Bool { if phoneNum.characters.count != 11 || phoneNum.characters.count == 0 { return false } let mobile = "^1[3|4|5|7|8][0-9]//d{8}$" let regexMobile = NSPredicate(format: "SELF MATCHES %@",mobile) let isValid:Bool = regexMobile.evaluate(with: phoneNum) if !isValid { return false } return true }2://有的手機(jī)系統(tǒng)讀取到的手機(jī)號(hào)都有'-',所以去除'-' func removeUnuseChar(str:String) -> String { var tmpStr = str for char in tmpStr.characters { if char == "-" { let range = tmpStr.range(of: "-") tmpStr.removeSubrange(range!) } } return tmpStr }3: func readRecords() -> [AddressBookObj] //原始有效數(shù)據(jù) { self.originalAddressData.removeAll() if #available(iOS 9, *){ let keysToFetch = [CNContactFormatter.descriptorForRequiredKeys(for: CNContactFormatterStyle.fullName),CNContactPhoneNumbersKey] as [Any] try! self.contact.enumerateContacts(with: CNContactFetchRequest(keysToFetch: keysToFetch as! [CNKeyDescriptor]), usingBlock: {[weak self] (contact, pointer) in var phone = "" if contact.phoneNumbers.count > 0 { let phoneNum = contact.phoneNumbers.first guard let phoneNumber = phoneNum?.value else { return } let phoneString = phoneNumber.stringValue let result = self?.removeUnuseChar(str: phoneString) if self!.validateMobile(result!) { phone = result! } if phone != "" { let obj:AddressBookObj = AddressBookObj() obj.phone = phone let name:String = String(format: "%@%@", contact.givenName,contact.familyName) obj.name = name self?.originalAddressData.append(obj) print("CNContact:/(name):/(phone)") } } }) return originalAddressData }else{ let peoples = ABAddressBookCopyArrayOfAllPeople(self.addressBook).takeRetainedValue() as [ABRecord] for people: ABRecord in peoples { var firstName = "" var lastName = "" var phone = "" if let firstNameUnmanaged = ABRecordCopyValue(people, kABPersonLastNameProperty) { firstName = firstNameUnmanaged.takeRetainedValue() as? String ?? "" } if let lastNameUnmanaged = ABRecordCopyValue(people, kABPersonFirstNameProperty) { lastName = lastNameUnmanaged.takeRetainedValue() as? String ?? "" } let phoneNums: ABMultiValue = ABRecordCopyValue(people, kABPersonPhoneProperty).takeRetainedValue() as ABMultiValue for index in 0..<ABMultiValueGetCount(phoneNums){ let label = ABMultiValueCopyValueAtIndex(phoneNums, index).takeRetainedValue() as! String let result = self.removeUnuseChar(str: label) if self.validateMobile(result) { phone = result break } } if phone != "" { let obj:AddressBookObj = AddressBookObj() obj.phone = phone let name:String = String(format: "%@%@", lastName,firstName) obj.name = name self.originalAddressData.append(obj) print("ABAddressBook:/(name):/(phone)") } } return originalAddressData } }

聯(lián)系人數(shù)據(jù)的排序與使用:

//數(shù)據(jù)處理:排序、傳給后端,更新UIfunc updateOroginalData(){ //得出27個(gè)索引 let collation = UILocalizedIndexedCollation.current() let sectionTitles = collation.sectionTitles.count //self.sectionTitleArr存放section數(shù)組 self.sectionTitleArr = NSMutableArray(array: collation.sectionTitles) //初始化27個(gè)空數(shù)組 self.dataArrays存放numberOfRowsInSection var i = 0 while i<sectionTitles { let arr = NSMutableArray() self.dataArrays.add(arr) i += 1 } for obj in self.originalAddressData { if obj.name != "" { let sectionNum = collation.section(for: obj, collationStringSelector: #selector(obj.nameMethod)) let array:NSMutableArray = self.dataArrays[sectionNum] as! NSMutableArray array.add(obj) } } //對(duì)每個(gè)section中的數(shù)組按name排序 for i in 0..<self.dataArrays.count { let arr:NSMutableArray = self.dataArrays[i] as! NSMutableArray let sortArr = collation.sortedArray(from: arr as [AnyObject], collationStringSelector: #selector(getter: xxClass.name)) arr.removeAllObjects() arr.addObjects(from: sortArr) } //去掉無(wú)數(shù)據(jù)的數(shù)組 let tmpArrA = NSMutableArray() let tmpArrB = NSMutableArray() for i in 0..<self.dataArrays.count { let arr = self.dataArrays[i] if (arr as AnyObject).count == 0 { tmpArrA.add(self.sectionTitleArr[i]) tmpArrB.add(self.dataArrays[i]) } } for i in 0..<tmpArrA.count { self.sectionTitleArr.remove(tmpArrA[i]) self.dataArrays.remove(tmpArrB[i]) } tableView.reloadData()}
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 郧西县| 哈巴河县| 遂昌县| 额敏县| 皮山县| 双鸭山市| 阜南县| 平度市| 东乌珠穆沁旗| 壤塘县| 增城市| 遂川县| 周宁县| 囊谦县| 万山特区| 津南区| 读书| 长阳| 民勤县| 南宫市| 威海市| 翁牛特旗| 灵丘县| 酒泉市| 商水县| 铁力市| 锡林郭勒盟| 嵊州市| 镇康县| 磴口县| 无极县| 甘南县| 莱西市| 奈曼旗| 石景山区| 彩票| 夏河县| 宣恩县| 土默特右旗| 绥化市| 会泽县|