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

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

swift3下通訊錄的開發

2019-11-09 16:21:18
字體:
來源:轉載
供稿:網友

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()}
上一篇:c語言學習之snprintf

下一篇:Adroid 廣播

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二中文字幕在线看| 日韩精品视频免费在线观看| 欧美激情伊人电影| 色悠悠国产精品| 欧美丰满老妇厨房牲生活| 日本久久精品视频| 国产成人精品久久二区二区91| 久久99国产精品自在自在app| 欧美有码在线观看| 国产精品第1页| 91在线无精精品一区二区| 亚洲字幕在线观看| 97人人模人人爽人人喊中文字| 久久免费在线观看| 欧美激情精品在线| 中文字幕在线看视频国产欧美在线看完整| 欧美另类精品xxxx孕妇| 欧美放荡办公室videos4k| 亚洲精品国产免费| 精品自在线视频| 亚洲二区中文字幕| 在线视频一区二区| 亚洲人高潮女人毛茸茸| 亚洲网站在线播放| 26uuu另类亚洲欧美日本一| 俺也去精品视频在线观看| 久久综合电影一区| 久久久国产视频91| 亚洲欧美国产日韩中文字幕| 国产亚洲激情视频在线| 亚洲欧美中文在线视频| 亚洲网站视频福利| 麻豆精品精华液| 国产精品直播网红| 91沈先生作品| 欧美在线亚洲在线| 国产精品嫩草影院一区二区| 91日韩在线播放| 欧美极品少妇xxxxⅹ喷水| 国产a∨精品一区二区三区不卡| 欧美激情中文字幕乱码免费| 欧美综合一区第一页| 久久久久久久久电影| 午夜精品久久久久久久久久久久久| 欧美一区二区三区免费观看| 97激碰免费视频| 国产精自产拍久久久久久蜜| 国产91色在线免费| 久久好看免费视频| 日韩大片在线观看视频| 欧美激情va永久在线播放| 91中文精品字幕在线视频| 亚洲成色777777在线观看影院| 成人网页在线免费观看| 在线视频日韩精品| 精品久久久在线观看| 亚洲国产成人av在线| 日韩一区视频在线| 欧美国产日本在线| 国产精品久久久久久久久久久不卡| 国产精品久久国产精品99gif| 亚洲精品国产成人| 全球成人中文在线| 欧美午夜精品久久久久久人妖| 国产一区二区三区在线视频| 精品久久久久久久久久久| 欧美自拍大量在线观看| 久久久精品久久久| 欧美俄罗斯乱妇| 久久久久久久一区二区| 2019日本中文字幕| 丝袜亚洲另类欧美重口| 国产日韩欧美在线视频观看| 国产欧美日韩丝袜精品一区| 国产精品自产拍在线观看中文| 欧美日韩人人澡狠狠躁视频| 欧美大片在线看免费观看| 狠狠久久亚洲欧美专区| 国产视频亚洲精品| 揄拍成人国产精品视频| 国产日韩在线观看av| 日韩欧美精品网站| 视频直播国产精品| 日韩国产欧美区| 九九热精品在线| 欧美日韩中文在线| 精品成人久久av| 中文字幕亚洲欧美一区二区三区| 97成人在线视频| 中文字幕日韩在线播放| 97av在线视频| 国产精品男人的天堂| 68精品国产免费久久久久久婷婷| 91精品国产综合久久香蕉| 91在线观看免费网站| 一区二区三区动漫| 97久久精品视频| 色综合影院在线| 91精品久久久久久综合乱菊| 福利一区视频在线观看| 欧美最猛性xxxxx(亚洲精品)| 日韩免费av一区二区| 日韩av在线免费播放| 欧美激情性做爰免费视频| 午夜精品蜜臀一区二区三区免费| 91久久久久久久| 综合网日日天干夜夜久久| 久久久精品2019中文字幕神马| 国产亚洲美女精品久久久| 九九热精品视频国产| 日韩av成人在线| 亚洲精品久久久久久久久久久久久| 日韩精品视频中文在线观看| 亚洲精品v天堂中文字幕| 国产欧美韩国高清| 97国产精品免费视频| 亚洲视频精品在线| 欧美日韩国产精品一区二区三区四区| 亚洲韩国欧洲国产日产av| 精品调教chinesegay| 国产一区二区色| 欧美亚洲国产视频小说| 久久久噜噜噜久噜久久| 成人国产精品久久久| 伊人久久久久久久久久久久久| 成人伊人精品色xxxx视频| 亚洲一区二区免费在线| 91欧美精品成人综合在线观看| 欧美激情亚洲一区| 在线视频日韩精品| 中文字幕国内精品| 全色精品综合影院| 亚洲欧洲日产国码av系列天堂| 中文.日本.精品| 精品久久久久久久久久ntr影视| 国产精品白嫩初高中害羞小美女| 精品在线小视频| 欧美二区乱c黑人| 日韩精品在线影院| 精品二区三区线观看| 日韩欧美大尺度| 最近2019免费中文字幕视频三| 亚洲一区二区三区四区在线播放| 日韩在线视频线视频免费网站| 国产精品日韩久久久久| 久久影院模特热| 国产日韩在线观看av| 精品久久久999| 国产精品久久av| 亚洲国产高清高潮精品美女| 中文字幕v亚洲ⅴv天堂| 91久久精品国产91久久性色| 欧美激情喷水视频| 成人在线国产精品| 亚洲精品一区二区久| 日韩男女性生活视频| 亚洲精品国精品久久99热| 欧美成人亚洲成人| 亚洲人成77777在线观看网| 琪琪亚洲精品午夜在线| 91精品国产综合久久久久久久久| 91精品视频播放| 91久久精品国产91久久| 欧美激情免费视频|