iOS 9:获取CNContact国家代码和电话号码

iOS 9:获取CNContact国家代码和电话号码,ios,swift,Ios,Swift,我想从iOS 9上的CNContact获取国家代码和电话号码。我尝试了很多东西,但都找不到办法。我取得的最佳效果是打印: <CNPhoneNumber: 0x7f886389a140: countryCode=us, digits=5555648583> 我想要的是countryCode和digits的值。你知道如何在Swift中访问它们吗?谢谢 这两个成员可以通过valueForKey访问: let countryCode = number.valueForKey("countr

我想从iOS 9上的CNContact获取国家代码和电话号码。我尝试了很多东西,但都找不到办法。我取得的最佳效果是打印:

<CNPhoneNumber: 0x7f886389a140: countryCode=us, digits=5555648583>

我想要的是countryCode和digits的值。你知道如何在Swift中访问它们吗?谢谢

这两个成员可以通过
valueForKey
访问:

let countryCode = number.valueForKey("countryCode") as? String
let digits = number.valueForKey("digits") as? String

请注意,由于这两个字段是私有API的一部分,因此不能保证在未来版本的
联系人
框架中不会删除/替换它们。

不幸的是,您无法获取它们,因为它们是私有的

let numberValue = number.value

let countryCode = numberValue.valueForKey("countryCode") as? String
let digits = numberValue.valueForKey("digits") as? String
这是可行的,但如果你在这方面做了一些事情,你的应用程序很可能会被拒绝。

你可以看到所有你可以使用的好东西

如果你不打算将你的应用程序上传到商店,上面的解决方案是可以的,否则我会坚持使用某种正则表达式,因为我知道它将来可能会崩溃:

countryCode=(\w{2}),.*digits=(.+)>$

Objective-C:

[number.value valueForKey:@"countryCode"]
Swift:

number.value.valueForKey("countryCode") as? String

valueForKey
不是私有的,您的应用不会被拒绝。

/*只获取第一个手机号码*/

    let MobNumVar = (contact.phoneNumbers[0].value as! CNPhoneNumber).valueForKey("digits") as! String
    print(MobNumVar)
    for ContctNumVar: CNLabeledValue in contact.phoneNumbers
    {
        let MobNumVar  = (ContctNumVar.value as! CNPhoneNumber).valueForKey("digits") as? String
        print(MobNumVar!)
    }
/*获取所有手机号码*/

    let MobNumVar = (contact.phoneNumbers[0].value as! CNPhoneNumber).valueForKey("digits") as! String
    print(MobNumVar)
    for ContctNumVar: CNLabeledValue in contact.phoneNumbers
    {
        let MobNumVar  = (ContctNumVar.value as! CNPhoneNumber).valueForKey("digits") as? String
        print(MobNumVar!)
    }
/*获取带有手机国家/地区代码的手机号码*/

    for ContctNumVar: CNLabeledValue in contact.phoneNumbers
    {
        let FulMobNumVar  = ContctNumVar.value as! CNPhoneNumber
        let MccNamVar = FulMobNumVar.valueForKey("countryCode") as? String
        let MobNumVar = FulMobNumVar.valueForKey("digits") as? String

        print(MccNamVar!)
        print(MobNumVar!)
    }

要获取国家代码,您可以使用以下命令:

(contact.phoneNumbers[0].value ).value(forKey: "countryCode") as! String

输入for循环和键;“数字”用于获取完整的电话号码。

请不要使用强制展开,如果该值为
nil
谢谢!也许这就是我找不到解决办法的原因。现在我将使用正则表达式。它违反了审查准则2.5。Objective-C是一种动态语言,因此您可以访问任何您想要访问的内容。他正在查询的值没有文档记录,不应在生产代码中使用,因为它可能会在未来的版本中更改而没有任何警告。实际上
NSObject.value(forKey:)
是公共的。不公开的是密钥
“数字”
。无论如何,我知道这个应用程序已经成功批准了好几次,所以它是相当安全的。实际上,正则表达式应该是
\+[0-9]{1,3}
,因为国家代码可能有1、2或3个数字。你能评论一下它为什么不是私有的吗?根据fpg1503,它似乎违反了指南2.5,因为它没有记录在案。我希望你是对的,只是想确定一下!谢谢。如果你使用这个,你会被拒绝,如果你不这样做,你很幸运,但这违反了苹果的指南。在not+91中给出:(至少需要对这样一个代码块进行一些解释。此外,我认为OP希望提取国家代码和电话号码作为单独的实体。)。。
fetch contacts without country code, spaces ,braces and dash  from contacts book with contact picker and textfield both 
*********** without country code

 import ContactsUI
 var phoneString:String!

    func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
            let numbers = contact.phoneNumbers.first
            let a = (numbers?.value)?.stringValue ?? ""
            let myString = a
            let formattedString = myString.replacingOccurrences(of: " ", with: "")
            let newFormattedString = formattedString.replacingOccurrences(of: "(", with: "")
            let formatstring = newFormattedString.replacingOccurrences(of: ")", with: "")
            let  last10  = formatstring.replacingOccurrences(of: "-", with: "")
            phoneString = String(last10.suffix(10))
            phonetextField.text = phoneString
            
        }
        
        func contactPickerDidCancel(_ picker: CNContactPickerViewController) {
            self.dismiss(animated: true, completion: nil)
        }
       @IBAction func inviteButton(_ sender : Any)
        {
            if phoneString == nil{
                phoneString =  phonetextField.text! //fetching from phonetextfield
                Phone = phoneString
            }
            else  {
                Phone = phoneString //fetching from phone contacts
            
            }
          }