为什么有些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上运行时都会发生这种情况。
知道这里可能会发生什么吗?
答案 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
这将询问用户对联系人列表的权限。