Swift:JKContactsKit 获取通讯录的联系人

简介: Swift:JKContactsKit 获取通讯录的联系人

JKSwiftExtension,测试用例在 JKContactsKitViewController 里面

目录:


  • 1、简介和CNKeyDescriptor的key介绍
  • 2、通讯录的基本使用
  • 获取授权状态
  • 查询出所有通讯录信息
  • 添加新联系人
  • 更新联系人
  • 删除联系人


一、简介和CNKeyDescriptor的key介绍



  • 1.1、在 iOS9.0 之前, 我们只能通过 AddressBook 框架来获取通讯录联系人信息。但 AddressBook framework 语法很奇怪,同时也十分难用。所以苹果从 iOS9.0 开始推出的全新的联系人框架 Contacts FrameWork 作为替代,同时将原来的 AddressBook 给废弃掉。
  • 1.2、Contacts FrameWork 同样包含两种访问通讯录的方式:
  • ContactsUI.framework 框架 : 通过系统提供的通讯录交互界面来访问(替代原先的 AddressBookUI.framework)
  • Contacts.framework 框架 : 没有界面,通过代码来获取所有联系人信息(替代原先的 AddressBook.framework)
  • 由于苹果安全策略更新,在使用 Xcode8 开发时,需要在 Info.plist 配置请求通讯录的相关描述字段(Privacy - Contacts Usage Description
  • 1.3、CNKeyDescriptor的key介绍


//  标识符
@available(iOS 9.0, *)
public let CNContactIdentifierKey: String
// 姓名前缀
@available(iOS 9.0, *)
public let CNContactNamePrefixKey: String
// 姓名
@available(iOS 9.0, *)
public let CNContactGivenNameKey: String
// 中间名
@available(iOS 9.0, *)
public let CNContactMiddleNameKey: String
// 姓氏
@available(iOS 9.0, *)
public let CNContactFamilyNameKey: String
// 之前的姓氏(ex:国外的女士)
@available(iOS 9.0, *)
public let CNContactPreviousFamilyNameKey: String
// 姓名后缀
@available(iOS 9.0, *)
public let CNContactNameSuffixKey: String
// 昵称
@available(iOS 9.0, *)
public let CNContactNicknameKey: String
// 公司(组织)
@available(iOS 9.0, *)
public let CNContactOrganizationNameKey: String
// 部门
@available(iOS 9.0, *)
public let CNContactDepartmentNameKey: String
// 职位
@available(iOS 9.0, *)
public let CNContactJobTitleKey: String
// 名字的拼音或音标
@available(iOS 9.0, *)
public let CNContactPhoneticGivenNameKey: String
// 中间名的拼音或音标
@available(iOS 9.0, *)
public let CNContactPhoneticMiddleNameKey: String
// 形式的拼音或音标
@available(iOS 9.0, *)
public let CNContactPhoneticFamilyNameKey: String
// 公司(组织)的拼音或音标(iOS10 才开始存在的呢)
@available(iOS 10.0, *)
public let CNContactPhoneticOrganizationNameKey: String
// 生日
@available(iOS 9.0, *)
public let CNContactBirthdayKey: String
// 农历
@available(iOS 9.0, *)
public let CNContactNonGregorianBirthdayKey: String
// 备注
@available(iOS 9.0, *)
public let CNContactNoteKey: String
// 头像
@available(iOS 9.0, *)
public let CNContactImageDataKey: String
// 头像的缩略图
@available(iOS 9.0, *)
public let CNContactThumbnailImageDataKey: String
// 头像是否可用
@available(iOS 9.0, *)
public let CNContactImageDataAvailableKey: String
// 类型
@available(iOS 9.0, *)
public let CNContactTypeKey: String
// 电话号码
@available(iOS 9.0, *)
public let CNContactPhoneNumbersKey: String
// 邮箱地址
@available(iOS 9.0, *)
public let CNContactEmailAddressesKey: String
// 住址
@available(iOS 9.0, *)
public let CNContactPostalAddressesKey: String
// 其他日期
@available(iOS 9.0, *)
public let CNContactDatesKey: String
// url地址
@available(iOS 9.0, *)
public let CNContactUrlAddressesKey: String
// 关联人
@available(iOS 9.0, *)
public let CNContactRelationsKey: String
// 社交
@available(iOS 9.0, *)
public let CNContactSocialProfilesKey: String
// 即时通信
@available(iOS 9.0, *)
public let CNContactInstantMessageAddressesKey: String


二、通讯录的基本使用



  • 2.1、获取授权状态


// MARK: 1.1、获取授权状态
/// 获取授权状态
/// - Returns: 授权状态
static func authorizationStatus() -> CNAuthorizationStatus {
    // 获取授权状态
    return CNContactStore.authorizationStatus(for: .contacts)
}
  • 2.2、查询出所有通讯录信息


// MARK: 1.2、获取通讯录的信息
/// 获取通讯录的信息
/// - Parameter keys: 获取Fetch,并且指定之后要获取联系人中的什么属性
///   - completion: 结果闭包
static func selectContactsData(keys: [String] = [CNContactFamilyNameKey, CNContactGivenNameKey, CNContactOrganizationNameKey, CNContactPhoneNumbersKey, CNContactNicknameKey], completion: @escaping (([CNContact], Error?) -> Void)) {
     // 创建通讯录对象
     let store = CNContactStore()
     store.requestAccess(for: .contacts) {(granted, error) in
         if (granted) && (error == nil) {
             // 创建请求对象 需要传入一个(keysToFetch: [CNKeyDescriptor]) 包含'CNKeyDescriptor'类型的数组
             let request = CNContactFetchRequest(keysToFetch: keys as [CNKeyDescriptor])
             do {
                 var contacts: [CNContact] = []
                 // 需要传入一个CNContactFetchRequest
                 try store.enumerateContacts(with: request, usingBlock: {(contact : CNContact, stop : UnsafeMutablePointer) -> Void in
                     contacts.append(contact)
                 })
                 completion(contacts, nil)
             } catch {
                 completion([], nil)
             }
         } else {
             completion([], error)
         }
     }
}
  • 2.3、添加新联系人


// MARK: 1.3、添加新联系人
/// 添加新联系人
/// - Parameters:
///   - contact: 联系人的信息
///   - completion: 结果闭包
static func addContactItem(contact: CNMutableContact, completion: @escaping ((Bool, Error?) -> Void)) {
     // 创建通讯录对象
     let store = CNContactStore()
     store.requestAccess(for: .contacts) {(granted, error) in
         if (granted) && (error == nil) {
             // 添加联系人请求
             let saveRequest = CNSaveRequest()
             saveRequest.add(contact, toContainerWithIdentifier: nil)
             do {
                 // 写入联系人
                 try store.execute(saveRequest)
                 completion(true, nil)
             } catch {
                 completion(true, error)
            }
         } else {
             completion(false, error)
         }
     }
}
  • 2.4、更新联系人


// MARK: 1.4、更新联系人
/// 更新联系人
/// - Parameters:
///   - identifier: 唯一标识符
///   - familyName: 姓氏
///   - givenName: 名字
///   - phoneNumbers: 手机号码数组
///   - keys: key
///   - completion: 结果闭包
static func updateContactItem(identifier: String, familyName: String, givenName: String, phoneNumbers: [CNLabeledValue<CNPhoneNumber>], keys: [String] = [CNContactFamilyNameKey, CNContactGivenNameKey, CNContactOrganizationNameKey, CNContactPhoneNumbersKey, CNContactNicknameKey], completion: @escaping ((Bool, Error?) -> Void)) {
  // 创建通讯录对象
  let store = CNContactStore()
  store.requestAccess(for: .contacts) {(granted, error) in
      if (granted) && (error == nil) {
          guard let itemContact = try? store.unifiedContact(withIdentifier: identifier, keysToFetch: keys as [CNKeyDescriptor]) else {
              return
          }
          let mutableContact = itemContact.mutableCopy() as! CNMutableContact
          mutableContact.familyName = familyName
          mutableContact.givenName = givenName
          mutableContact.phoneNumbers = phoneNumbers
          // 修改联系人请求
          let request = CNSaveRequest()
          request.update(mutableContact)
          do {
              // 修改联系人
              try store.execute(request)
              completion(true, error)
          } catch {
              completion(false, error)
          }
      } else {
          completion(false, error)
      }
  }
}
  • 2.5、删除联系人


// MARK: 1.5、删除联系人
/// 删除联系人
/// - Parameters:
///   - identifier: 唯一标识符
///   - keys: key
///   - completion: 结果闭包
static func deleteContactItem(identifier: String, keys: [String] = [CNContactFamilyNameKey, CNContactGivenNameKey, CNContactOrganizationNameKey, CNContactPhoneNumbersKey, CNContactNicknameKey], completion: @escaping ((Bool, Error?) -> Void)) {
    // 创建通讯录对象
    let store = CNContactStore()
    store.requestAccess(for: .contacts) {(granted, error) in
        if (granted) && (error == nil) {
            guard let itemContact = try? store.unifiedContact(withIdentifier: identifier, keysToFetch: keys as [CNKeyDescriptor]) else {
                return
            }
            let mutableContact = itemContact.mutableCopy() as! CNMutableContact
            // 删除联系人请求
            let request = CNSaveRequest()
            request.delete(mutableContact)
            do {
                // 执行操作
                try store.execute(request)
                completion(true, error)
            } catch {
                completion(false, error)
            }
        } else {
            completion(false, error)
        }
    }
}


目录
相关文章
|
5月前
|
Android开发
Android通讯录开发之通讯录联系人搜索功能最新实现
Android通讯录开发之通讯录联系人搜索功能最新实现
|
5月前
文件版本的通讯录
文件版本的通讯录
47 1
【C】—文件版本通讯录的实现
【C】—文件版本通讯录的实现
|
iOS开发
IOS添加通讯录
IOS添加通讯录
83 0
通讯录文件版本
文件版本的通讯录,可以保存
90 0
|
存储 数据库 开发者
iOS9系列专题五——全新的联系人与联系人UI框架(二)
iOS9系列专题五——全新的联系人与联系人UI框架
384 0
iOS9系列专题五——全新的联系人与联系人UI框架(二)