4

任何想法为什么有些CNContacts人会带着空电话号码回来?

我不断得到这样的输出:

"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 上运行时。

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

4

2 回答 2

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

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

于 2016-12-10T16:03:24.383 回答
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))
    }
于 2016-10-27T15:00:13.113 回答