如何联系(名字,姓氏,联系人,号码)

时间:2015-12-09 11:55:26

标签: ios swift ios8 ios9

我使用AddessBook库(用于ios8)获取所有联系人(名字,姓氏,contactId,所有电话号码)。它在同步器上工作得很好。

我的代码:

private func getContacts()->[Person] {

    var peapleOfContact: [Person] = []

    if !self.determineStatus() {
        return peapleOfContact
    }

    if let people = ABAddressBookCopyArrayOfAllPeople(self.adbk)?.takeRetainedValue() as? NSArray {
        for person in people{
            let contactID = ABRecordGetRecordID(person)
            let firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty).takeRetainedValue() as! String
            let lastName = ABRecordCopyValue(person, kABPersonLastNameProperty).takeRetainedValue() as! String
            let personOfContact = Person(id: String(contactID), firstName: firstName, lastName: lastName)
            let numbers:ABMultiValue = ABRecordCopyValue(person, kABPersonPhoneProperty).takeRetainedValue()
            for ix in 0 ..< ABMultiValueGetCount(numbers) {
                let type = ABMultiValueCopyLabelAtIndex(numbers,ix).takeRetainedValue() as String
                let number = ABMultiValueCopyValueAtIndex(numbers,ix).takeRetainedValue() as! String
                let cleaned = self.removeSpecialCharsFromString(type)
                let shortNumber = self.makeSpecialShortNumberFromString(number)
                let phone = Number(number: number, short: shortNumber, type: cleaned)
                personOfContact.addPhoneNumber(phone)
            }
            peapleOfContact.append(personOfContact)
        }

    }
    return peapleOfContact
}

当xcode 7.1.1更新并使用ios9时,此库无法使用,因此使用了ContactUI Framework。

我的代码:

private func getContact(){

    let keysToFetch = [CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName),
        CNContactImageDataKey,
        CNContactPhoneNumbersKey]

    let fetchRequest = CNContactFetchRequest(keysToFetch: keysToFetch)

    do {
        try store.enumerateContactsWithFetchRequest(fetchRequest, usingBlock: { (let contact, let stop) -> Void in
            self.contacts.append(contact)
        })
    }
    catch let error as NSError {
        print(error.localizedDescription)
    }
}

并像这样使用:

self.getContact()
    for contact in self.contacts{
        print("Full name: \(CNContactFormatter.stringFromContact(contact, style: .FullName))")
        print("Give name: \(contact.givenName)")
        print("fimily name: \(contact.familyName)")
        print("Idnetifier name: \(contact.identifier)")

        for phoneNo in contact.phoneNumbers {
            if phoneNo.label == CNLabelPhoneNumberMobile {
                let number = (phoneNo.value as! CNPhoneNumber).stringValue
                print("Phone Number: \(number)")
            }
        }
    }

但未找到contactId。如何获得contactId?如何使用ContactUI Framework? 告诉我。感谢

3 个答案:

答案 0 :(得分:2)

在iOS 9. *中,有一个名为&#39; Contacts&#39;

的新框架

用法:

  

导入联系人

    var validContacts: [CNContact] = []
    let contactStore = CNContactStore()

    // Request for contact access
    contactStore.requestAccessForEntityType(.Contacts) { (granted, e) -> Void in

        if granted {

            do {                    
                // Specify the key fields that you want to be fetched.
                // Note: if you didn't specify your specific field request. your app will crash
                let fetchRequest = CNContactFetchRequest(keysToFetch: [CNContactGivenNameKey, CNContactMiddleNameKey, CNContactFamilyNameKey, CNContactEmailAddressesKey, CNContactPhoneNumbersKey, CNContactImageDataKey, CNContactThumbnailImageDataKey])

                try contactStore.enumerateContactsWithFetchRequest(fetchRequest, usingBlock: { (contact, error) -> Void in

                    // Lets filter (optional)
                    if !contact.emailAddresses.isEmpty || !contact.phoneNumbers.isEmpty {
                        validContacts.append(contact)
                    }
                })

                print(validContacts)
            }catch let e as NSError {
                print(e)
            }
        }
    }

解析:

    // Loop through contatcs
        for contact in validContacts {

            var phoneNumbers: [String] = []
            for phoneNumber in contact.phoneNumbers {
                let value = phoneNumber.value as! CNPhoneNumber
                phoneNumbers.append(value.stringValue)
            }

            var emailAddresses: [String] = []
            for emailAddress in contact.emailAddresses {
                let value = emailAddress.value as! String
                emailAddresses.append(value)
            }

            if let imageData = contact.imageData {
                let image = UIImage(data: imageData)

                print("image: \(image)")
            }

            // Lets log
            print("givenName: \(contact.givenName), middleName: \(contact.middleName), familyName: \(contact.familyName), phoneNumbers: \(phoneNumbers), emailAddresses: \(emailAddresses)\n")
        }

我有一个实现这个的示例项目。 GitHub

答案 1 :(得分:0)

此代码示例将帮助您:

  public static func refreshContacts(){
        let status = ABAddressBookGetAuthorizationStatus()
        if status == .Denied || status == .Restricted {
            // user previously denied, to tell them to fix that in settings
            return
        }

    // open it

    var error: Unmanaged<CFError>?
    let addressBook: ABAddressBook? = ABAddressBookCreateWithOptions(nil, &error)?.takeRetainedValue()
    if addressBook == nil {
        println(error?.takeRetainedValue())
        return
    }

    // request permission to use it

    ABAddressBookRequestAccessWithCompletion(addressBook) {
        granted, error in

        if !granted {
            // warn the user that because they just denied permission, this functionality won't work
            // also let them know that they have to fix this in settings
            return
        }

        if let people = ABAddressBookCopyArrayOfAllPeople(addressBook)?.takeRetainedValue() as? NSArray {
            for person in people{
                if let name = ABRecordCopyValue(person, kABPersonFirstNameProperty).takeRetainedValue() as? String {
                    println(name)//persons name
                }
                let numbers:ABMultiValue = ABRecordCopyValue(
                    person, kABPersonPhoneProperty).takeRetainedValue()
                for ix in 0 ..< ABMultiValueGetCount(numbers) {
                    let label = ABMultiValueCopyLabelAtIndex(numbers,ix).takeRetainedValue() as String
                    let value = ABMultiValueCopyValueAtIndex(numbers,ix).takeRetainedValue() as! String
                    println("Phonenumber \(label) is \(value))
                }
            }

        }
    }
}

答案 2 :(得分:0)

请尝试这个为我工作。根据givenname(名字)排序。首先导入联系人

let contactStore = CNContactStore()
    var results: [CNContact] = []
    do {
        let request:CNContactFetchRequest
        request = CNContactFetchRequest(keysToFetch: [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactMiddleNameKey, CNContactEmailAddressesKey,CNContactPhoneNumbersKey])
        request.sortOrder = CNContactSortOrder.GivenName
        try contactStore.enumerateContactsWithFetchRequest(request) {
            (contact, cursor) -> Void in
            results.append(contact)
            }
    }
    catch{
        print("Handle the error please")
    }

    print(results)