2016-04-06 10 views
2

Irgendwelche Ideen, warum einige CNContacts kommen mit leeren Telefonnummern?iOS 9 - abgeholt Kontakte zurück mit leeren Telefonnummern

Ich erhalte eine Ausgabe wie folgt aus:

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

So zum Beispiel, wenn ich Kontakte aus dem Simulator-internen Kontakte App holen, ich gemischte Ergebnisse erhalten: "John Appleseed"tut Rückkehr mit seinen Telefonnummern, aber "Kate Bell" tut nicht - obwohl sie eindeutig Telefonnummern hat. Es ist ziemlich seltsam, weil ich definitiv CNContactPhoneNumbersKey in meiner Fetch-Anfrage verwende.

Hier ist mein Code:

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

Wie ich bereits erwähnt, wird der Ausgang zeigt, dass manchmal der abgerufene Kontakt mit Telefonnummern kommt zurück, und manchmal ist es nicht. Gleiches gilt für E-Mails: Manchmal werden sie zurückgegeben, manchmal nicht.

Das passiert sowohl im Simulator als auch wenn ich dieses auf meinem iPhone laufe.

Irgendeine Idee, was hier geschehen könnte?

+0

, die Ihnen helfen können, einen weiteren Ket in fetchKeys 'CNContactViewController.descriptorForRequiredKeys' hinzuzufügen – jay

Antwort

0

Wenn Telefonnummern in der Kontakte-App hinzugefügt werden, fehlt ihnen manchmal ein Etikett (z. B. "Zuhause" oder "Telefon" ...) Wenn die Bezeichnung Null ist, werden die Nummern nicht angezeigt. Eine Problemumgehung wäre, explizit eine Standardbezeichnung für die fehlenden Elemente festzulegen. Ein einfaches Beispiel:

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

Sie sollten die folgenden Zeilen zu info.plist hinzufügen.

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

Und wenn die Zeit der Benutzer Kontakte in Ihrer App für aktuelle die Warnung für die Erlaubnis zugreifen sollten Sie eine Methode, es zu tun mögen nennen:

- (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; 
    } 
} 

Der Code Methode, die ich aus nahm: Programmatically Request Access to Contacts

Dies fragt den Benutzer nach Berechtigungen für die Kontaktliste.