【问题标题】:iOS 9 - fetched Contacts return with empty Phone NumbersiOS 9 - 获取的联系人返回空电话号码
【发布时间】:2016-04-06 04:02:12
【问题描述】:

知道为什么有些CNContacts 会返回 EMPTY 电话号码吗?

我不断得到这样的输出:

"phoneNumbers=(not fetched), emailAddresses=(not fetched),"

例如,当我从模拟器的内置联系人应用程序中获取联系人时,我得到了不同的结果: "John Appleseed"确实返回了它的电话号码,但"Kate Bell"没有 - 尽管她显然已经电话号码。 这很奇怪,因为我肯定在我的 fetch 请求中使用了CNContactPhoneNumbersKey

这是我的代码:

let fetchKeys = [ CNContactEmailAddressesKey, CNContactPhoneNumbersKey, 
                  CNContactFormatter.descriptorForRequiredKeysForStyle(.FullName) ]
let contactFetchRequest = CNContactFetchRequest(keysToFetch: fetchKeys)

do { 
   try self.contactsStore.enumerateContactsWithFetchRequest(contactFetchRequest) {                     
   fetchedContact, stop in
         print("fetched Contact is: \n\(fetchedContact.description)")
   }
}

正如我所提到的,输出显示有时获取的联系人会返回电话号码,但有时不会。电子邮件也一样:有时会被退回,有时不会。

在模拟器中以及在我的 iPhone 上运行时都会发生这种情况。

知道这里会发生什么吗?

【问题讨论】:

  • 这可能会帮助您在 fetchKeys CNContactViewController.descriptorForRequiredKeys 中添加一个 ket
  • 我在尝试检查是否 ([person.emailAddresses count] > 0) 时崩溃了

标签: ios swift ios9 cncontact cncontactstore


【解决方案1】:

在通讯录应用中添加电话号码时,有时会漏掉一个标签(例如“家”或“电话”...) 如果标签为空,则不显示数字。一种解决方法是为丢失的标签显式设置默认标签。一个简单的例子:

for phoneNumber in contact.phoneNumbers {
        guard let phone = phoneNumber.value as? CNPhoneNumber
            else { continue }

        let phoneLabel = phoneNumber.label == nil ? "DefaultLabel" : phoneNumber.label!

        phoneNumbers.append((phone.stringValue,phoneLabel))
    }

【讨论】:

    【解决方案2】:

    您应该在 info.plist 中添加以下行。

     <key>NSContactsUsageDescription</key>
    <string>$(PRODUCT_NAME) contact use</string>
    

    当用户访问您应用中的联系人以显示权限警报时,您应该调用一些方法来执行此操作,例如:

    - (void)checkPermissionForCNContacts
    {
        switch ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts])
        {
            case CNAuthorizationStatusNotDetermined:
            {
                [[[CNContactStore alloc] init] requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable error) {
                    if (granted == YES)
                      [self METHOD_NAME_FOR_OPENING_THE_CONTACT_LIST];
                }];
            }
                break;
            case CNAuthorizationStatusRestricted:
            case CNAuthorizationStatusDenied:
                // Show custom alert
                break;
            case CNAuthorizationStatusAuthorized:
               [self METHOD_NAME_FOR_OPENING_THE_CONTACT_LIST];
                break;
        }
    }
    

    我取自的方法代码: Programmatically Request Access to Contacts

    这将要求用户授予联系人列表的权限。

    【讨论】:

      猜你喜欢
      • 2016-12-26
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多