Swift电话本工具类
jopen
9年前
// // AddressBookUtils.swift // ArtCircle // // Created by wupeng on 15/12/15. // // import UIKit import AddressBook import Contacts class AddressBookUtils: NSObject { @available(iOS 8.0, *) static func getSysContacts() -> [[String:String]] { let sysAddressBookStatus = ABAddressBookGetAuthorizationStatus() if sysAddressBookStatus == .Denied || sysAddressBookStatus == .NotDetermined { // Need to ask for authorization // var error:Unmanaged<CFError>? // let addressBook: ABAddressBookRef? = ABAddressBookCreateWithOptions(nil, &error).takeRetainedValue() // let authorizedSingal:dispatch_semaphore_t = dispatch_semaphore_create(0) // let askAuthorization:ABAddressBookRequestAccessCompletionHandler = { success, error in // if success { // ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue() as NSArray // dispatch_semaphore_signal(authorizedSingal) // } // } // ABAddressBookRequestAccessWithCompletion(addressBook, askAuthorization) // dispatch_semaphore_wait(authorizedSingal, DISPATCH_TIME_FOREVER) return [] } else { return AddressBookUtils.analyzeSysContacts( ABAddressBookCopyArrayOfAllPeople(ABAddressBookCreate().takeRetainedValue()).takeUnretainedValue() as NSArray ) } } @available(iOS 8.0, *) static func analyzeSysContacts(sysContacts:NSArray) -> [[String:String]] { var allContacts:Array = [[String:String]]() for contact in sysContacts { var currentContact:Dictionary = [String:String]() // 姓 var firstName = "" let tempFirstName = ABRecordCopyValue(contact, kABPersonFirstNameProperty)?.takeRetainedValue() as? String if tempFirstName != nil { firstName = tempFirstName! } // 名 var lastName = "" let tempLastName = ABRecordCopyValue(contact, kABPersonLastNameProperty)?.takeRetainedValue() as? String if tempLastName != nil { lastName = tempLastName! } // 电话 let tempPhone = ABRecordCopyValue(contact, kABPersonPhoneProperty).takeRetainedValue() as? ABMultiValueRef let phone = ABMultiValueCopyValueAtIndex(tempPhone,0).takeRetainedValue() as? String currentContact["\(firstName)\(lastName)"] = phone allContacts.append(currentContact) } return allContacts } // IOS9使用contact @available(iOS 9.0, *) static func getContacts() -> [CNContact] { let status = CNContactStore.authorizationStatusForEntityType(.Contacts) if status == CNAuthorizationStatus.Denied || status == CNAuthorizationStatus.NotDetermined { // 需要权限 return [CNContact]() } else { let store = CNContactStore() let keysToFetch = [CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName),CNContactPhoneNumbersKey] let fetchRequest = CNContactFetchRequest(keysToFetch: keysToFetch) var contacts = [CNContact]() do { try store.enumerateContactsWithFetchRequest(fetchRequest, usingBlock: { (let contact, let stop) -> Void in contacts.append(contact) }) } catch let error as NSError { print(error.localizedDescription) } return contacts } } static func uploadContacts(withSuccessHandler handler:( (value:AnyObject) -> Void )) { var params:Dictionary<String,String> = Dictionary() params["contact"] = AddressBookUtils.generateUploadContactString() NetworkUtils.postRequest(GetUrlUtils.getUrlUploadContacts(), parameters: params, successHandler: { response in handler(value: response.result.value!) }) { response in } } static func generateUploadContactString() -> String { var uploadParamsString = "" if #available(iOS 9.0, *) { let contacts = AddressBookUtils.getContacts() for (_,object) in contacts.enumerate() { let contact = object let userName = "\(contact.givenName)\(contact.familyName)" var userNameEncode = StringUtils.URLEncodedString(userName) for number in contact.phoneNumbers { let phoneNumber = number.value as! CNPhoneNumber userNameEncode = userNameEncode?.stringByAppendingString(":") let phoneNum = phoneNumber.stringValue.stringByReplacingOccurrencesOfString("-", withString: "") userNameEncode = userNameEncode?.stringByAppendingString(phoneNum) userNameEncode = userNameEncode?.stringByAppendingString(";") } uploadParamsString = uploadParamsString.stringByAppendingString(userNameEncode!) } } else { // Fallback on earlier versions let contacts = AddressBookUtils.getSysContacts() for dict in contacts { for (name,phone) in dict { let fullName = name let phoneNumber = phone var userNameEncode = fullName.URLEncodedString() userNameEncode = userNameEncode!.stringByAppendingString(":") let phoneNum = phoneNumber.stringByReplacingOccurrencesOfString("-", withString: "") userNameEncode = userNameEncode!.stringByAppendingString(phoneNum) userNameEncode = userNameEncode!.stringByAppendingString(";") uploadParamsString = uploadParamsString.stringByAppendingString(userNameEncode!) } } } return uploadParamsString } }