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

17
我想从iOS 9的CNContact中获取国家代码和电话号码。我尝试了很多方法,但找不到一种方法。我取得的最好结果是打印出来:
<CNPhoneNumber: 0x7f886389a140: countryCode=us, digits=5555648583>

以下是我的做法:

func contactPicker(picker: CNContactPickerViewController, didSelectContact contact: CNContact) {
    print(contact.phoneNumbers.count)
    for number: CNLabeledValue in contact.phoneNumbers {
        print(number.value)
    }
}

我想要的是countryCode和digits的值。有什么办法可以在Swift中访问它们吗?谢谢!

6个回答

11

很遗憾,由于它们是私有的,所以您无法获取它们。

let numberValue = number.value

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

这样做是可行的,但如果您在此方面做了某些事情,您的应用程序很可能会被拒绝。

您可以看到所有美好的东西,您可以使用这里

如果您不打算将应用上传到商店,则上述解决方案是可行的;否则,我建议使用某种正则表达式,尽管它可能会在将来出现问题:

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

请不要使用强制解包,如果值为nil,您将会遇到崩溃。 - Cristik
谢谢!可能这就是为什么我找不到解决方案的原因。我现在会使用正则表达式。 - Mr Stanev
2
它违反了审查指南2.5。Objective-C是一种动态语言,因此您将能够访问几乎任何想要的内容。他正在查询的值是未记录的,不应在生产代码中使用,因为它可能会在未来版本中进行更改而没有任何警告。 - fpg1503
1
事实上,NSObject.value(forKey:)是公开的。不公开的是键“digits”。无论如何,我知道使用它的应用已经成功通过了多次审批,因此它是相当安全的。 - Alexander Vasenin
1
实际上,正则表达式应该是\+[0-9]{1,3},因为国家代码可能有1、2或3个数字。 - Jorge Revuelta
显示剩余2条评论

7

Objective-C:

[number.value valueForKey:@"countryCode"]

Swift:

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

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


你能否评论一下它为什么不是私有的?根据fpg1503所说,它似乎违反了2.5指南,因为它没有记录。我很希望你是正确的,只是想要确定一下!谢谢。 - nickpharris
如果你使用这个,你将被拒绝,如果你没有使用,那么你很幸运,但这违反了苹果的指南。 - fpg1503
1
它返回的是IN而不是+91 :( - Abhishek Thapliyal

0

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

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

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

0

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

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

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

这段代码需要至少一些解释。此外,我认为原始提问者想要将国家代码和电话号码作为单独的实体提取出来。 - Louis Shraga

-2

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

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

在for循环中,关键字“digits”是获取完整电话号码的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接