访问通讯录

作者: LY2528 | 来源:发表于2016-11-20 09:02 被阅读0次

iOS 9.0 之前获取通讯录

  • AddressBookUI 的使用
    • 创建选择联系人控制器
    • 设置代理
    • 实现代理方法(在代理方法中拿到用户选择的联系人)
    • 弹出控制器
    • 主要代码实现
// MARK - 代理方法的实现
extension ViewController : ABPeoplePickerNavigationControllerDelegate {
    
    // 用户选中了某一个联系人
    func peoplePickerNavigationController(_ peoplePicker: ABPeoplePickerNavigationController, didSelectPerson person: ABRecord) {
        // 1.获取联系人的姓名
        /*
         Unmanaged<CFTypeRef>? : 非托管对象
            * 在Swift和C语言进行混编的过程中,产生的一个临时对象,真正使用的时候需要将非托管对象,转成真正的对象才能进行使用
            * takeUnretainedValue : 表示在转化的过程中,不会对对象进行一次retain操作
            * takeRetainedValue : 表示在转化的过程中,有对对象进行一次retain操作
                注意:一旦使用takeRetainedValue,那么必须对之前的非托管对象进行一次release(),否则就会产生内存泄漏
                 let UnManageObjc = ABRecordCopyValue(person, kABPersonLastNameProperty)
                 let lastname = UnManageObjc?.takeRetainedValue() as? String
                 UnManageObjc?.release()
        */
        guard let lastname = ABRecordCopyValue(person, kABPersonLastNameProperty).takeUnretainedValue() as? String else { return }
        guard let firstname = ABRecordCopyValue(person, kABPersonFirstNameProperty).takeUnretainedValue() as? String else { return }
        print("姓名: \(firstname)" + " \(lastname)")
        
        // 2.获取联系人的电话号码
        // ABMultiValue 类似于一个字典,里面有key/value
        // 2.1.从person中拷贝出来所有的电话号码
        let phones = ABRecordCopyValue(person, kABPersonPhoneProperty).takeUnretainedValue() as ABMultiValue
        // 2.2.遍历ABMultiValue中的所有电话
        let count = ABMultiValueGetCount(phones)
        
        for i in 0..<count {
            
            //获得电话号码前的标签(home,main)
            let phoneLabel = ABMultiValueCopyLabelAtIndex(phones, i).takeUnretainedValue() as String
            
            //获取对应的电话号码
            guard let phoneValue = ABMultiValueCopyValueAtIndex(phones, i).takeUnretainedValue() as? String else { continue }
            
            print("\(phoneLabel)" + ": \(phoneValue)")
        }
    }
}

  • AddressBook 的使用
    • 获取用户的授权
      • 获取授权状态
      • 如果用户是未决定状态,则请求
    • 获取联系人信息
      • 获取授权状态
      • 如果是已经授权,则获取联系人信息
      • 创建通讯录对象
      • 获取通讯录中所有人的信息
      • 遍历所有的联系人,获取联系人信息

iOS 9.0之后获取通讯录

  • ContactsUI 的使用
    • 对应的是 AddressBookUI
  • Contacts 的使用
    • 对应的是 AddressBook
    • 获取用户授权代码的实现
    • 获取联系人信息的代码的实现
// MARK - 获取用户授权代码的实现
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        
        // 1.获取授权状态
        // CNContactStore --> 通信录对象
        let status = CNContactStore.authorizationStatus(for: .contacts)
        
        // 2.判断如果是未决定状态,请求授权
        if status == .notDetermined {
            // 2.1.创建通信录对象
            let store = CNContactStore()
            
            // 2.2.请求授权
            store.requestAccess(for: .contacts, completionHandler: { (isFlag : Bool, error : Error?) in
                if isFlag {
                    print("授权成功")
                } else {
                    print("授权失败")
                }
            })
        }
        
        return true
    }
    
// MARK - 获取联系人信息的代码的实现
// 1.获取授权状态
        let status = CNContactStore.authorizationStatus(for: .contacts)
        
        // 2.判断是否是已经授权
        guard status == .authorized else {
            return
        }
        
        // 3.创建通信录对象
        let store = CNContactStore()
        
        // 4.从通信录中获取所有的联系人
        // 4.1.获取fetch,并且指定之后要获取联系人中的什么属性
        let keys = [CNContactFamilyNameKey as NSString, CNContactGivenNameKey as NSString, CNContactPhoneNumbersKey as NSString]
        
        // 4.2.创建请求对象
        let request = CNContactFetchRequest(keysToFetch: keys)
        
        // 4.3.遍历所有的联系人
        do {
            try store.enumerateContacts(with: request, usingBlock: { (contact : CNContact, stop : UnsafeMutablePointer<ObjCBool>) -> Void in
                // 1.获取姓名
                let lastname = contact.familyName
                let firstname = contact.givenName
                print(lastname, firstname)
                
                // 2.获取电话号码
                let phoneNumers = contact.phoneNumbers
                for phone in phoneNumers {
                    print(phone.label ?? "没有Label")
                    print(phone.value.stringValue)
                }
            })
        } catch {
            print(error)
        }
        
    }

相关文章

  • 通讯录

    申请访问通讯录 //实例化通讯录对象ABAddressBookRefaddressBook= ABAddressB...

  • 重点 (二十九) : 通讯录

    如何访问用户的通讯录 在iOS中,有2个框架可以访问用户的通讯录 AddressBookUI.framework ...

  • 访问通讯录

    iOS 9.0 之前获取通讯录 AddressBookUI 的使用创建选择联系人控制器设置代理实现代理方法(在代理...

  • 通讯录

    如何访问用户的通讯录: 授权状态 申请访问通讯录 联系人属性定义 简单属性 获得所有的联系人数据 CoreFoun...

  • ios 权限记录

    NSContactsUsageDescription 请求访问通讯录 NSMicr...

  • ios 访问通讯录

    - (void)requestAuthorizationForAddressBook { // 判断当前的...

  • 访问通讯录Contacts

  • iOS 访问通讯录

    iOS 9 之后,苹果增加新特性的库 - ContactsUI.framework 和 Contacts.fram...

  • iOS权限配置

    访问相应的功能时,要在plist配置相应的权限 摄像头(相机)权限 相册权限 蓝牙权限 日历权限 访问通讯录 访问...

  • 通过Native.js访问iOS原生通讯录界面(Contacts

    网上有关于Native.js访问Android原生通讯录的案例(可以参考:Android调用系统通讯录控件,nat...

网友评论

    本文标题:访问通讯录

    本文链接:https://www.haomeiwen.com/subject/lfoepttx.html