亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

swift3下通訊錄的開發

2019-11-09 15:06:44
字體:
來源:轉載
供稿:網友

swift3下通訊錄的開發

1:封裝一個通訊錄Manager:

iOS9之后,通訊錄用CNContactStore實現;iOS9之前使用ABAddressBook。

讀取通訊錄的流程:

檢測授權;沒有權限申請權限;得到權限讀取通訊錄消息。

2:開始封裝AddressBookManger單例:

基本信息設置與實現:

iOS10之后需要在plist文件中添加訪問權限:key:PRivacy - Contacts Usage Description value:contactsDesciption。

mannager單例實現:

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

分別創建一個CNContactStore和ABAddressBook的屬性:

//注意調用ABAddressBookCreateWithOptions進行ABAddressBookCreateWithOptions的初始化需要設置為一個lazy變量,否則在用戶拒絕授權的情況下,程序將會崩潰。因為ABAddressBookCreateWithOptions(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() //獲取當前系統版本號 lazy var current_iOS_Version:Float = { return UIDevice.current.systemVersion.floatValue }() var originalAddressData:[AddressBookObj] = [] //用于存放通訊錄里的原始有效數據創建一個對外的權限授權狀態: //@objc如果是在OC和swift3混編的工程里,OC的類需要使用到AddressBookAuthorizationStatus枚舉,則加上@objc,這樣就可以在OC類里也使用,否則無需@objc標注 @objc enum AddressBookAuthorizationStatus:Int { case deniedOrRestricted = 1 case authorized = 2 case notDeterMined = 3 }

授權:

檢測授權情況

//檢測授權情況 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: //訪問限制或者拒絕 彈出設置對話框 return .deniedOrRestricted case .authorized://已授權,加載數據 return .authorized case .notDetermined://從未進行過授權操作、請求授權 return .notDeterMined } } }

請求授權

//請求授權 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://謂詞表達式判斷手機號碼是否有效 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://有的手機系統讀取到的手機號都有'-',所以去除'-' 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] //原始有效數據 { 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 } }

聯系人數據的排序與使用:

//數據處理:排序、傳給后端,更新UIfunc updateOroginalData(){ //得出27個索引 let collation = UILocalizedIndexedCollation.current() let sectionTitles = collation.sectionTitles.count //self.sectionTitleArr存放section數組 self.sectionTitleArr = NSMutableArray(array: collation.sectionTitles) //初始化27個空數組 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) } } //對每個section中的數組按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) } //去掉無數據的數組 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()}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩视频在线免费观看| 亚洲网址你懂得| 久久久久亚洲精品国产| 午夜美女久久久久爽久久| 91久久久久久| 亚洲变态欧美另类捆绑| 亚洲免费电影一区| 欧亚精品中文字幕| 中日韩美女免费视频网站在线观看| 国产精品ⅴa在线观看h| 日韩在线观看电影| 亚洲亚裔videos黑人hd| 日韩av影片在线观看| 奇米四色中文综合久久| 国产精品久久久久久久久久久新郎| 久久影视三级福利片| 欧美成人免费观看| 国产精品久久久一区| 国产精品一区二区性色av| 在线午夜精品自拍| 国产精品亚洲欧美导航| 亚洲第一区中文99精品| 国产日韩欧美中文在线播放| 97av视频在线| 欧美劲爆第一页| 亚洲国产中文字幕在线观看| www国产91| 久久久国产视频91| 亚洲成人在线视频播放| 日韩在线中文字幕| www亚洲欧美| 日韩欧美在线视频日韩欧美在线视频| 91久久综合亚洲鲁鲁五月天| 亚洲精品国产综合区久久久久久久| 91地址最新发布| 91丝袜美腿美女视频网站| 久久久电影免费观看完整版| 97国产真实伦对白精彩视频8| 久久精品2019中文字幕| 久久精品中文字幕免费mv| 青青草原一区二区| 91精品久久久久久久久久另类| 中文字幕精品国产| 久久免费观看视频| 91夜夜未满十八勿入爽爽影院| 国产精品久久久久7777婷婷| 最近免费中文字幕视频2019| 亚洲国产精品嫩草影院久久| 亚洲免费人成在线视频观看| 一夜七次郎国产精品亚洲| 亚洲精品美女视频| 91久久精品在线| 美女福利视频一区| 色天天综合狠狠色| 国产精品av在线播放| 日韩禁在线播放| 狠狠久久五月精品中文字幕| 人妖精品videosex性欧美| 亚洲精品国产综合区久久久久久久| 亚洲女在线观看| 日韩性xxxx爱| 亚洲美女黄色片| 亚洲国产精品人人爽夜夜爽| 欧美日韩亚洲成人| 亚洲国产精品中文| 国产在线精品播放| 国内精久久久久久久久久人| 国产精品视频99| 久久久久久久久久久成人| 日韩高清免费观看| 国产一区二区丝袜| 日韩av中文字幕在线| 亚洲欧美一区二区三区情侣bbw| 一区二区国产精品视频| 岛国精品视频在线播放| 久久综合免费视频| 亚洲影院色无极综合| 国产精品免费久久久久久| 黑人精品xxx一区一二区| 欧美性理论片在线观看片免费| 国产欧美最新羞羞视频在线观看| 久久久精品久久久久| 91精品在线观看视频| 欧美精品福利在线| 亚洲国产精品久久精品怡红院| 亚洲第一页中文字幕| 久久九九全国免费精品观看| 国产在线精品自拍| 国产日韩在线亚洲字幕中文| 日韩精品欧美激情| 97超级碰碰人国产在线观看| 久久精品视频中文字幕| 日韩在线欧美在线| 91成人性视频| 欧美高清videos高潮hd| 这里只有精品久久| 久久人人爽人人爽爽久久| 国产视频精品一区二区三区| 亚洲精品一区av在线播放| 日韩精品视频免费在线观看| 成人日韩av在线| 亚洲综合色av| 国产精品爽爽爽| 国产精品入口免费视频一| 亚洲精品有码在线| 亚洲精品国产精品久久清纯直播| 亚洲国产一区二区三区四区| 日韩欧美主播在线| 最新国产精品拍自在线播放| 欧美日韩免费网站| 日韩亚洲在线观看| 少妇久久久久久| 美日韩丰满少妇在线观看| 亚洲福利视频网站| 欧美日韩在线视频首页| 亚洲性生活视频| 亚洲欧美日韩精品久久亚洲区| 中文字幕欧美视频在线| 国产免费一区二区三区香蕉精| 91精品国产综合久久男男| 亚洲国产美女精品久久久久∴| 中文字幕亚洲一区| 亚洲xxx视频| 欧美二区在线播放| 亚洲精品美女久久| 国内精品久久久久久影视8| 激情久久av一区av二区av三区| 国产亚洲欧美日韩美女| 欧美性猛交xxxx乱大交3| 亚洲国产精品悠悠久久琪琪| 国产精品日韩欧美综合| 亚洲人成在线免费观看| 亚洲国产精品人人爽夜夜爽| 青青青国产精品一区二区| 成人在线小视频| 日韩中文字幕不卡视频| 国产精品成人一区二区| 亚洲欧美日韩中文在线制服| 亚洲午夜未满十八勿入免费观看全集| 亚洲综合最新在线| 国产精品精品国产| 色琪琪综合男人的天堂aⅴ视频| 亚洲美女黄色片| 国产精品白嫩美女在线观看| 一区二区三区视频免费在线观看| 国产自摸综合网| 亚洲视频在线观看网站| 在线视频欧美日韩| 亚洲精品自拍偷拍| 日韩在线视频观看| 国产精品视频在线观看| 国产美女精彩久久| yellow中文字幕久久| 日韩电影在线观看免费| 欧美疯狂性受xxxxx另类| 欧美尤物巨大精品爽| 中文字幕欧美日韩在线| 18一19gay欧美视频网站| 18一19gay欧美视频网站| 精品福利视频导航| 亚洲国产精品中文| 欧美午夜视频一区二区| 日韩中文av在线| 中文字幕在线视频日韩|