iOS 9:获取CNContact国家代码和电话号码
我想从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
<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
}
}