【问题标题】:iOS 9: get CNContact country code and phone numberiOS 9:获取 CNContact 国家代码和电话号码
【发布时间】:2016-04-16 07:02:57
【问题描述】:

我想在 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 中访问它们?谢谢!

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    很遗憾,您无法获取它们,因为它们是私有的。

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

    这可行,但如果您在这行中执行某些操作您的应用很可能会被拒绝。

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

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

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

    【讨论】:

    • 请不要使用强制解包,如果值为nil会崩溃
    • 谢谢!可能这就是我找不到解决方案的原因。我现在将使用正则表达式。
    • 它违反了审查指南2.5。 Objective-C 是一种动态语言,因此您几乎可以访问任何您想要访问的内容。他正在查询的值未记录在案,不应在生产代码中使用,因为它可能会在未来版本中更改而不会发出任何警告。
    • 其实NSObject.value(forKey:)是公开的。不公开的是密钥"digits"。无论如何,我知道使用这个的应用程序成功批准了几次,所以它是合理安全的。
    • 实际上,正则表达式应该是\+[0-9]{1,3},因为国家代码可能有1、2或3个数字。
    【解决方案2】:

    Objective-C:

    [number.value valueForKey:@"countryCode"]
    

    Swift:

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

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

    【讨论】:

    • 你能评论一下它是如何不私密的吗?根据 fpg1503,它似乎违反了准则 2.5,因为它没有记录在案。我希望你是对的,只是想确定一下!谢谢。
    • 如果你使用它,你会被拒绝,如果你不这样做,你很幸运,但这违反了 Apple 准则
    • 它给 IN 不是 +91 :(
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:
        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
                    
                    }
                  }
        

        【讨论】:

        • 这样的代码块至少需要一些解释。另外,我认为 OP 想将国家代码和电话号码提取为单独的实体..
        【解决方案6】:

        要获取国家/地区代码,您可以使用:

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

        在for循环中,和key; “digits”是获取完整的电话号码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-09
          • 2015-01-19
          • 2018-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-03
          • 1970-01-01
          相关资源
          最近更新 更多