访问通讯录

作者: 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)
            }
            
        }
    
    

    相关文章

      网友评论

        本文标题:访问通讯录

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