简体   繁体   English

ios中的联系人选择器以获取电话号码

[英]Contact picker in ios to get phone number

在此处输入图像描述 I need an option like image picker for picking contact and to display phone number i have managed to get contact names using below code我需要一个像图像选择器这样的选项来选择联系人并显示我已经设法使用以下代码获取联系人姓名的电话号码

by using this code it only returns the names , need an option to pick contact from contact list通过使用此代码,它只返回名称,需要从联系人列表中选择联系人的选项

import ContactsUI导入ContactsUI
and include - CNContactPickerDelegate并包括 - CNContactPickerDelegate

import ContactsUI

class YourViewController: CNContactPickerDelegate{

    //MARK:- contact picker
    func onClickPickContact(){


        let contactPicker = CNContactPickerViewController()
        contactPicker.delegate = self
        contactPicker.displayedPropertyKeys =
            [CNContactGivenNameKey
                , CNContactPhoneNumbersKey]
        self.present(contactPicker, animated: true, completion: nil)

    }

    func contactPicker(_ picker: CNContactPickerViewController,
                       didSelect contactProperty: CNContactProperty) {

    }

    func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
        // You can fetch selected name and number in the following way

        // user name
        let userName:String = contact.givenName

        // user phone number
        let userPhoneNumbers:[CNLabeledValue<CNPhoneNumber>] = contact.phoneNumbers
        let firstPhoneNumber:CNPhoneNumber = userPhoneNumbers[0].value


        // user phone number string
        let primaryPhoneNumberStr:String = firstPhoneNumber.stringValue

        print(primaryPhoneNumberStr)

    }

    func contactPickerDidCancel(_ picker: CNContactPickerViewController) {

    }
}
import ContactsUI

private let contactPicker = CNContactPickerViewController()

Button click that initiates contact picker:启动联系人选择器的按钮单击:

@IBAction func accessContacts(_ sender: Any) {
    contactPicker.delegate = self
    self.present(contactPicker, animated: true, completion: nil)
}

Implement delegate methods实现委托方法

extension YourViewController: CNContactPickerDelegate {

    func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
        let phoneNumberCount = contact.phoneNumbers.count

        guard phoneNumberCount > 0 else {
            dismiss(animated: true)
            //show pop up: "Selected contact does not have a number"
            return
        }

        if phoneNumberCount == 1 {
            setNumberFromContact(contactNumber: contact.phoneNumbers[0].value.stringValue)

        } else {
            let alertController = UIAlertController(title: "Select one of the numbers", message: nil, preferredStyle: .alert)

            for i in 0...phoneNumberCount-1 {
                let phoneAction = UIAlertAction(title: contact.phoneNumbers[i].value.stringValue, style: .default, handler: {
                alert -> Void in
                    self.setNumberFromContact(contactNumber: contact.phoneNumbers[i].value.stringValue)
                })
                alertController.addAction(phoneAction)
            }
            let cancelAction = UIAlertAction(title: "Cancel", style: .destructive, handler: {
            alert -> Void in

            })
            alertController.addAction(cancelAction)

            dismiss(animated: true)
            self.present(alertController, animated: true, completion: nil)
        }
    }

    func setNumberFromContact(contactNumber: String) {

        //UPDATE YOUR NUMBER SELECTION LOGIC AND PERFORM ACTION WITH THE SELECTED NUMBER

        var contactNumber = contactNumber.replacingOccurrences(of: "-", with: "")
        contactNumber = contactNumber.replacingOccurrences(of: "(", with: "")
        contactNumber = contactNumber.replacingOccurrences(of: ")", with: "")
        contactNumber = contactNumber.removeWhitespacesInBetween()
        guard contactNumber.count >= 10 else {
            dismiss(animated: true) {
                self.popUpMessageError(value: 10, message: "Selected contact does not have a valid number")
            }
            return
        }
        textFieldNumber.text = String(contactNumber.suffix(10))

    }

    func contactPickerDidCancel(_ picker: CNContactPickerViewController) {

    }
}

You can use this extension to get a contact name.您可以使用此扩展来获取联系人姓名。

extension CNContact {
    open func displayName() -> String {
        return givenName + " " + familyName
    }
}

This is Class to get Some details EPContact这是获取一些详细信息的课程 EPContact

Swift 5 & Contact Picker Get Email Swift 5 & Contact Picker 获取电子邮件

I wanted to show an example of how you can do the same thing you asked for but for email instead and updated for Swift 5 since some of the answers do not compile correctly above.我想展示一个示例,说明如何执行您要求的相同操作,但使用电子邮件代替并针对 Swift 5 进行更新,因为上面的某些答案编译不正确。 This also has the added bonus of the 'all' option which will concatenate multiple emails into one string if the user selects it or not.这还具有“全部”选项的额外好处,如果用户选择与否,它将将多封电子邮件连接成一个字符串。

First make sure to import import ContactsUI首先确保导入import ContactsUI

Then make sure you have an outlet to your textfield.然后确保你的文本字段有一个出口。

@IBOutlet var emailTextField: UITextField!

Next you need to set the contact picker as a member variable of your viewController.接下来,您需要将联系人选择器设置为 viewController 的成员变量。 This will hold the information for showing the contact picker later.这将保存稍后显示联系人选择器的信息。

class EmailViewController: UIViewController {
    @IBOutlet var emailTextField: UITextField!
    private let contactPicker = CNContactPickerViewController()

    //... rest of view controller code, etc...
}

Finally you can simply add this extension to the EmailViewController with the code below:最后,您可以使用以下代码简单地将这个扩展添加到 EmailViewController:

extension EmailViewController: CNContactPickerDelegate {

    func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
        let emailNumberCount = contact.emailAddresses.count

        //@JA - They have to have at least 1 email address
        guard emailNumberCount > 0 else {
            dismiss(animated: true)
            //show pop up: "Selected contact does not have a number"
            let alertController = UIAlertController(title: "No emails found for contact: "+contact.givenName+" "+contact.familyName, message: nil, preferredStyle: .alert)
            let cancelAction = UIAlertAction(title: "Ok", style: .default, handler: {
            alert -> Void in

            })
            alertController.addAction(cancelAction)
            self.present(alertController, animated: true, completion: nil)
            return
        }

        //@JA - If they have only 1 email it's easy.  If there is many emails we want to concatenate them and separate by commas , , ...
        if emailNumberCount == 1 {
            setEmailFromContact(contactEmail: contact.emailAddresses[0].value as String)
        } else {
            let alertController = UIAlertController(title: "Select an email from contact: "+contact.givenName+" "+contact.familyName+" or select 'All' to send to every email listed.", message: nil, preferredStyle: .alert)

            for i in 0...emailNumberCount-1 {
                let emailAction = UIAlertAction(title: contact.emailAddresses[i].value as String, style: .default, handler: {
                alert -> Void in
                    self.setEmailFromContact(contactEmail: contact.emailAddresses[i].value as String)
                })
                alertController.addAction(emailAction)
            }

            let allAction = UIAlertAction(title: "All", style: .destructive, handler: {
            alert -> Void in
                var emailConcat = ""
                for i in 0...emailNumberCount-1{
                    if(i != emailNumberCount-1){ //@JA - Only add the , if we are not on the last item of the array
                        emailConcat = emailConcat + (contact.emailAddresses[i].value as String)+","
                    }else{
                        emailConcat = emailConcat + (contact.emailAddresses[i].value as String)
                    }
                }
                self.setEmailFromContact(contactEmail: emailConcat)//@JA - Sends the concatenated version of the emails separated by commas
            })
            alertController.addAction(allAction)

            let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: {
            alert -> Void in

            })
            alertController.addAction(cancelAction)

            dismiss(animated: true)
            self.present(alertController, animated: true, completion: nil)
        }
    }

    func setEmailFromContact(contactEmail: String){
        emailTextField.text = contactEmail
    }

    func contactPickerDidCancel(_ picker: CNContactPickerViewController) {
        print("contact picker canceled")
    }
}

To call up the picker in the action event of a button for example you could do this:例如,要在按钮的操作事件中调用选择器,您可以这样做:

@IBAction func contactsButtonPressed(_ sender: UIButton) {
     contactPicker.delegate = self
     self.present(contactPicker, animated: true, completion: nil)
}

contactPicker.delegate = self works because of the extension on the viewController class (emailViewController) in my case that gives it access to the CNContactPickerDelegate protocol functions it requires. contactPicker.delegate = self工作,因为在我的例子中 viewController 类 (emailViewController) 上的扩展允许它访问它需要的CNContactPickerDelegate协议功能。

  • If contact have more than one phone numbers, then you can get the selected number by comparing the 'contactProperty.identifier' as below -如果联系人有多个电话号码,那么您可以通过比较“contactProperty.identifier”来获取所选号码,如下所示 -

     public func contactPicker(_ picker: CNContactPickerViewController, didSelect contactProperty: CNContactProperty) { tvName.text = contactProperty.contact.givenName var selectedNo = "" if contactProperty.key == "phoneNumbers" { contactProperty.contact.phoneNumbers.forEach({ phone in if phone.identifier == contactProperty.identifier { selectedNo = phone.value.stringValue } }) } tvContact.text = selectedNo }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM