iOS 9 - 获取的联系人返回空电话号码

时间:2016-04-06 04:02:12

标签: ios swift ios9 cncontact cncontactstore

为什么有些CNContacts会回复EMPTY电话号码?

我一直得到这样的输出:

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

例如,当我从模拟器的内置联系人应用程序中提取联系人时,我得到了混合的结果: "John Appleseed" 返回其电话号码,但"Kate Bell" - 甚至虽然她显然有电话号码。 这很奇怪,因为我在我的获取请求中肯定使用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)")
   }
}

正如我所提到的,输出结果显示有时获取的联系人带回电话号码,有时却没有。对于电子邮件也是如此:有时它们会被退回,有时则不会。

在Simulator和我在iPhone上运行时都会发生这种情况。

知道这里可能会发生什么吗?

2 个答案:

答案 0 :(得分:0)

当在联系人应用中添加电话号码时,他们有时会错过一个标签(例如"家庭"或"电话" ...) 如果标签为空,则不显示数字。解决方法是明确为缺少的标签设置默认标签。一个简单的例子:

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

答案 1 :(得分:0)

您应该在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

这将询问用户对联系人列表的权限。