简体   繁体   English

如何将电话号码返回给swift应用程序?

[英]How to return a phone number to swift app?

I want to have my user select a phone number for someone in their contacts and I want to return that number to the app so that I can use it for later. 我想让我的用户为他们的联系人中的某人选择一个电话号码,然后将该号码返回给应用程序,以便以后使用。 Here is my code for allowing the user to select one of their contacts phone numbers, but when I click a phone number it calls that number (which I don't want to happen) and doesn't return anything to my app. 这是我的代码,用于允许用户选择其联系人电话号码之一,但是当我单击一个电话号码时,它将呼叫该号码(我不希望发生),并且不会向我的应用返回任何内容。

    class ViewController: UIViewController {

var people = ABPeoplePickerNavigationController()
var addressBook: ABAddressBookRef?

func extractABAddressBookRef(abRef: Unmanaged<ABAddressBookRef>!) -> ABAddressBookRef? {
    if let ab = abRef {
        self.view.addSubview(people.view)
        return Unmanaged<NSObject>.fromOpaque(ab.toOpaque()).takeUnretainedValue()
    }
    return nil
}

func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, didSelectPerson person: ABRecordRef!, property: ABPropertyID, identifier: ABMultiValueIdentifier) {
    let multiValue: ABMultiValueRef = ABRecordCopyValue(person, property).takeRetainedValue()
    let index = ABMultiValueGetIndexForIdentifier(multiValue, identifier)
    let phoneNumber = ABMultiValueCopyValueAtIndex(multiValue, index).takeRetainedValue() as! String

    println(phoneNumber)
}

I have implemented a solution that only show contacts that have phone numbers, and the user has to select a concrete phone number. 我已经实现了一个解决方案,该解决方案仅显示具有电话号码的联系人,并且用户必须选择一个具体的电话号码。 Your ViewController has to implement ABPeoplePickerNavigationControllerDelegate protocol. 您的ViewController必须实现ABPeoplePickerNavigationControllerDelegate协议。

Here is my code: 这是我的代码:

func checkAuthorization ()
{
    switch (ABAddressBookGetAuthorizationStatus())
    {
        case .NotDetermined:
            ABAddressBookRequestAccessWithCompletion(ABAddressBookCreateWithOptions(nil, nil).takeRetainedValue(), 
            { (granted: Bool, error: CFError!) -> Void in
                if (granted)
                {
                    // Access granted, show picker
                    self.showPeoplePicker();
                }
                else
                {
                    // Custom func to show an alert
                    self.showAlertForContactPermission();
                }
            })
            break;

        case .Restricted, .Denied:
            // Custom func to show an alert
            showAlertForContactPermission();
            break;

        case .Authorized:
            // Access granted, show picker
            showPeoplePicker();
            break;
    }
}

func showPeoplePicker ()
{
    // Create picker
    let peoplePicker: ABPeoplePickerNavigationController = ABPeoplePickerNavigationController();
    peoplePicker.peoplePickerDelegate = self;

    // Show only contacts that have phone number
    peoplePicker.displayedProperties = [NSNumber(int: kABPersonPhoneProperty)];
    peoplePicker.predicateForEnablingPerson = NSPredicate(format: "phoneNumbers.@count > 0", argumentArray: nil);

    // User has to select explicity phone number
    peoplePicker.predicateForSelectionOfProperty = NSPredicate(format: "key == 'phoneNumbers'", argumentArray: nil);

    // Present picker
    presentViewController(peoplePicker, animated: true, completion: nil);
}

func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController, didSelectPerson person: ABRecord, property: ABPropertyID, identifier: ABMultiValueIdentifier)
{
    // Get name
    let name: String = ABRecordCopyCompositeName(person).takeRetainedValue() as String;

    // Get phone number selected
    let multiValuePhones: ABMultiValueRef = ABRecordCopyValue(person, property).takeRetainedValue();
    let selectedIndex: CFIndex = ABMultiValueGetIndexForIdentifier(multiValuePhones, identifier);
    let selectedPhone: String = ABMultiValueCopyValueAtIndex(multiValuePhones, selectedIndex).takeRetainedValue() as! String;

    // Get only digits
    let digitsArray: [String] = selectedPhone.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet);
    let phoneDigits: String = digitsArray.joinWithSeparator("");

    // Pass info to your func
    saveNewEmployee(name, phoneNumber: phoneDigits);
}

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

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