2016-04-06 4 views
2

Любые идеи, почему некоторые CNContacts возвращаются с ПУСТОЙ Телефонными номерами?iOS 9 - извлеченные контакты вернуться с пустыми номерами телефонов

я получаю выход, как это:

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

Как я уже говорил, вывод показывает, что иногда извлеченной Контакт возвращается с номерами телефонов, а иногда нет. То же самое для электронных писем: иногда они возвращаются, иногда нет.

Это происходит как в симуляторе, так и при запуске на моем iPhone.

Любая идея, что может случиться здесь?

+0

, которые могут помочь вам добавить еще один кет в fetchKeys 'CNContactViewController.descriptorForRequiredKeys' – jay

ответ

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

Это запросит у пользователя разрешения на список контактов.

Смежные вопросы