iOS 你不知道的新鲜事iOS 开发成长中心iOS学习

访问通讯录

2016-11-20  本文已影响0人  LY2528

iOS 9.0 之前获取通讯录

// 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)")
        }
    }
}

iOS 9.0之后获取通讯录

// 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)
        }
        
    }

上一篇下一篇

猜你喜欢

热点阅读