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

标签 swift contacts abaddressbook abpeoplepickerview

我想让我的用户为其联系人中的某个人选择一个电话号码,并且我想将该号码返回到应用程序,以便我以后可以使用它。这是我的代码,允许用户选择他们的联系人电话号码之一,但是当我单击一个电话号码时,它会调用该号码(我不希望发生这种情况)并且不会向我的应用程序返回任何内容。

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

最佳答案

我实现了一个仅显示具有电话号码的联系人的解决方案,并且用户必须选择一个具体的电话号码。您的 ViewController 必须实现 ABPeoplePickerNavigationControllerDelegate 协议(protocol)。

这是我的代码:

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

关于swift - 如何将电话号码返回到 swift 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31750874/

相关文章:

ios - ABAddressBook API 在大量使用该应用程序后停止工作?

ios - 如何在不将联系人存储在地址簿中的情况下创建联系人 (ABPerson)?

ios - 带有 é,è ... 和多个号码的地址簿名称

swift - HLS 流使用 AVAssetResourceLoaderDelegate TS 片段请求缺少 Cookie header

php - 使用纯 Swift、PHP 代码将视频上传到服务器

c# - 如何获取 Windows Phone 联系人列表中联系人的 ID?

flutter - 如何从flutter中的联系人中选择单个联系人

swift - 如何将Alamofire生成的数据从tableview推送到webview

Swift - 远离模态视图没有正确破坏 ViewController

android - EditText 限制最多 5 个联系人