2017-09-29 7 views
7

Ostatnio przełączyłem się ze starego schematu ABAddressBook na nowe CNContakty. W moim projekcie synchronizuję kontakty z natywnych z moimi własnymi danymi kontaktowymi. Do tego celu używam identyfikatora kontaktu i identyfikatora telefonu do synchronizowania numerów telefonów.CNContacts możliwy błąd z identyfikatorem telefonu?

Ale obserwujemy ciekawą rzecz, gdy próbuję edytować kontakt, nazywam tego wiersza kodu

func getContact() -> CNContact? { 
     let contactStore = CNContactStore() 
     guard let contactRecord = try? contactStore.unifiedContact(withIdentifier: "8222B6F1-DE99-4099-82A4-47EAB9206A94:ABPerson", keysToFetch: [CNContactViewController.descriptorForRequiredKeys()]) else { 
      return nil 
     } 
     return contactRecord 
    } 

@IBAction func showContact() { 

     let contactViewController = CNContactViewController(forNewContact: self.getContact()) 
     contactViewController.delegate = self 
     contactViewController.title = "New Contact" 

     let navigationController = UINavigationController(rootViewController: contactViewController) 
     navigationController.navigationBar.isTranslucent = false 
     self.present(navigationController, animated: true, completion: nil) 
    } 

func contactViewController(_ viewController: CNContactViewController, didCompleteWith contact: CNContact?) { 
     let newContact = self.getContact() 
     viewController.dismiss(animated: false, completion: nil) 
    } 

To jest naprawdę proste. Ale jeśli w CNContactViewController edytuję zdjęcie użytkownika, identyfikatory telefonu się zmienią, mimo że nie edytowałem numerów telefonów w tym kontrolerze. Identyfikator telefonu można łatwo wydrukować tak:

po newContact?.phoneNumbers.first?.identifier 

To naprawdę bałagan mój synchronizacji, ponieważ użytkownik może po prostu zmienić zdjęcie, ale identyfikatory dla numerów telefonów zmieni, a nie mam możliwości, by wiedzieć, co się stało . Ten identyfikator nie ulegnie zmianie, jeśli zmienię niektóre inne dane, takie jak nazwisko osoby, firma itp. Pozostanie ona taka sama, nawet jeśli zmienię telefon na inną wartość. Ale z jakiegoś powodu zmiana zdjęcia powoduje jej całkowite zniszczenie.

Czy ktoś inny to zaobserwował?

Oto Link do projektu próbki do testowania tej https://drive.google.com/file/d/0B9ngBRq15jSuZTBYNVJCaVJ5WGc/view?usp=sharing

EDIT: Przetestowałem to na prawdziwym telefonie

Odpowiedz

2

Próbowałem swój przykładowy projekt na symulatorze iPhone 8, ale nie wydaje się, aby odtworzyć problem. Oto wyjście tuż po tym, jak ustawić początkowy zdjęć Kontakt:

(lldb) po newContact?.phoneNumbers.first?.identifier 
▿ Optional<String> 
    - some : "E5D4EDC2-B6FC-4E86-9AF0-F6B78BAF41E5" 

(lldb) po oldContact?.phoneNumbers.first?.identifier 
▿ Optional<String> 
    - some : "E5D4EDC2-B6FC-4E86-9AF0-F6B78BAF41E5" 

A po I dotknij ponownie przycisk i ustawić inny zdjęcie jako zdjęcie kontaktu:

(lldb) po oldContact?.phoneNumbers.first?.identifier 
▿ Optional<String> 
    - some : "E5D4EDC2-B6FC-4E86-9AF0-F6B78BAF41E5" 

(lldb) po newContact?.phoneNumbers.first?.identifier 
▿ Optional<String> 
    - some : "E5D4EDC2-B6FC-4E86-9AF0-F6B78BAF41E5" 

Ci wszyscy wyglądają tak samo do mnie. Jedyną rzeczą, którą zrobiłem dla twojego projektu, była zmiana wyszukiwania w getContact() na identyfikator istniejący w mojej własnej bazie danych kontaktów.

+0

Spróbuj kilka razy to zrobić, ale na prawdziwym telefonie. Dodaj zdjęcie, a następnie zapisz, usuń zdjęcie, a następnie zapisz, jeszcze raz dodaj zdjęcie i na pewno się zmieni – MegaManX

2

upload przykład jak utworzyć nowy kontakt i jak go edytować

https://drive.google.com/file/d/0B7OUqtQ1nSxjb3lFTFA5WnlGdFk/view?usp=sharing

Aby utworzyć nowy kontakt Używam:

 let newContact = CNMutableContact() 
     newContact.givenName = "Jhonny" 
     newContact.nickname = "Jhonny" 
     newContact.familyName = "My Family" 
     newContact.phoneNumbers.append(CNLabeledValue(label: "Home", value: CNPhoneNumber(stringValue: "555-123-4567"))) 

     let contactViewController = CNContactViewController(forNewContact: newContact) 
     contactViewController.delegate = self 
     contactViewController.title = "New Contact" 
     let navigationController = UINavigationController(rootViewController: contactViewController) 
     self.present(navigationController, animated: true, completion: nil) 

zwrócić uwagę na ta linia:

let contactViewController = CNContactViewController(forNewContact: newContact) 

do edycji kontaktu Używam:

 let contactViewController = CNContactViewController(for: contactRecord) 
     contactViewController.delegate = self 
     contactViewController.title = "Edit Contact" 
     let navigationController = UINavigationController(rootViewController: contactViewController) 
     self.present(navigationController, animated: true, completion: nil) 

Ponownie należy zwrócić uwagę na tej linii

let contactViewController = CNContactViewController(for: contactRecord) 

Uważam, że problemem jest sposób wywoływania CNContactViewController. Konstruktor jest inny do tworzenia i edycji. W wersji demonstracyjnej zobaczysz w dzienniku konsoli, że identyfikator numeru telefonu pozostaje nienaruszony, nawet jeśli edytujesz zdjęcie lub cokolwiek innego.

+0

Wypróbowałem twój projekt i po kilku edycjach - dodałem zdjęcie/usuń zdjęcie, udało mi się uzyskać różne identyfikatory: **** kontakt givenName : Jhonny kontakt nick: 0F386257-4071-4CC2-A2BE-18048F0F8F87: ABPerson Telefon identyfikator numer: D2F8B6D5-A2AC-4194-96F9-F915294E6445 *** kontakt givenName: Jhonny kontakt nick: 0F386257-4071-4CC2-A2BE- 18048F0F8F87: ABPerson Identyfikator numeru telefonu: DB940E27-3ADC-42A2-8EB3-9DA7B0A7D6F4 – MegaManX

+0

@MegaManX Próbowałem, co powiedziałeś(), usuwając zdjęcie) i masz rację, zmienia się identyfikator telefonu. Testowałem to w iOS 10 i 11 i nadal to się dzieje. Czy mogę zapytać Do czego używasz tych identyfikatorów? Może jest inny sposób, aby osiągnąć to, czego potrzebujesz. – carlos21

+0

używam ich do synchronizacji z moją lokalną bazą danych, ponieważ numer telefonu nie jest unikalny, tj. Osoba może mieć takie same numery na swoim koncie kontaktowym. – MegaManX

Powiązane problemy