2016-06-18 25 views
3

Ich brauche die Kennung eines neu erstellten Kontakts direkt nach der Speicheranforderung. Der Anwendungsfall: In meiner App erstellt ein Benutzer einen neuen Kontakt und gibt ihm einige Attribute (zB Name, Adresse ...), danach kann er den Kontakt speichern. Dieses Szenario funktioniert wie erwartet. Mein Code sieht wie folgt aus:iOS9 Contacts Framework erhält Identifikator von neu gespeicherten Kontakt

func createContact(uiContact: Contact, withImage image:UIImage?, completion: String -> Void) 
    {  
     let contactToSave = uiContact.mapToCNContact(CNContact()) as! Cnmutablecontawctlet 
     if let newImage = image 
     { 
      contactToSave.imageData = UIImageJPEGRepresentation(newImage, 1.0) 
     } 
     request   = CNSaveRequest() 
     request.addContact(contactToSave, toContainerWithIdentifier: nil) 
     do 
     { 
      try self.contactStore.executeSaveRequest(request) 
      print("Successfully saved the CNContact") 
      completion(contactToSave.identifier) 
     } 
     catch let error 
     { 
     print("CNContact saving faild: \(error)") 
     completion(nil) 
     } 
    } 

Das Objekt (uiContact) ist nur ein Wrapper von CNContact. Im Abschlussabschluss muss ich den Identifier zurückgeben, aber zu dieser Zeit habe ich keinen Zugriff darauf, weil er vom System nach dem Schreibvorgang erstellt wird. Eine Lösung könnte die neu gespeicherte CNContact mit Prädikat

public func unifiedContactsMatchingPredicate(predicate: NSPredicate, keysToFetch keys: [CNKeyDescriptor]) throws -> [CNContact] 

aber das scheint mir wie ein bisschen unsauber, da dieser Kontakt nur einen Namen haben könnte und mehr zu holen, als man existieren könnte. So etwas wie ein Callback mit der erstellten Kennung wäre nett. Aber da ist es nicht. Gibt es eine andere Möglichkeit, dieses Problem zu lösen?

Antwort

1

Dies kann ein wenig spät sein, aber falls jemand das braucht.

Durch die neueste SDK (iOS 11), konnte ich die Kennung erhalten gerade von:

NSError *error = nil; 

saveReq = [[CNSaveRequest alloc] init]; 
[saveReq addContact:cnContact toContainerWithIdentifier:containerIdentifier]; 

if (![contactStore executeSaveRequest:saveReq error:&error]) { 
    NSLog(@"Failed to save, error: %@", error.localizedDescription); 
} 
else 
{ 
    if ([cnContact isKeyAvailable:CNContactIdentifierKey]) { 
     NSLog(@"identifier for new contact is: %@", cnContact.identifier); 
     // this works for me everytime 
    } else { 
     NSLog(@"CNContact identifier still isn't available after saving to address book"); 
    } 
}