2017-09-29 1 views
7

Récemment, je suis passé de l'ancien framework ABAddressBook aux nouveaux CNContacts. Dans mon projet, je synchronise les contacts natifs avec mes propres contacts de données de base. Pour cela, j'utilise un identifiant de contact et des identifiants téléphoniques pour synchroniser les numéros de téléphone.CNCcontacts possible bug avec l'identifiant du téléphone?

Mais je l'ai observé chose intéressante, lorsque je tente de modifier le contact, j'appelle cette ligne de code

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

Il est vraiment simple. Mais si dans CNContactViewController je modifie une photo d'utilisateur, les identifiants de téléphone changeront, même si je n'ai pas modifié les numéros de téléphone de ce contrôleur. L'identifiant de téléphone peut facilement être imprimé comme ceci:

po newContact?.phoneNumbers.first?.identifier 

Cela a vraiment bousille ma synchronisation, étant donné que l'utilisateur sera peut-être juste changer la photo, mais des identifiants pour les numéros de téléphone va changer, et je n'aura aucun moyen de savoir ce qui est arrivé . Cet identifiant ne changera pas si je modifie d'autres données, comme le nom des personnes, la société, etc. Il restera le même même si je modifie le téléphone à une autre valeur. Mais pour une raison quelconque, le changement de la photo est complètement perturbé.

Est-ce que quelqu'un d'autre a observé cela?

Voici lien exemple de projet pour tester cette https://drive.google.com/file/d/0B9ngBRq15jSuZTBYNVJCaVJ5WGc/view?usp=sharing

EDIT: Je l'ai testé ce sur le téléphone réel

Répondre

2

J'ai essayé votre exemple de projet sur un simulateur iPhone 8 mais ne semblent reproduire le problème. Voici la sortie juste après avoir mis une photo de contact initial:

(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" 

Et après je tape nouveau sur le bouton et définir une autre photo comme photo de contact:

(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" 

Les ressemblent tous à moi. La seule chose que j'ai faite à votre projet était de changer la recherche dans getContact() en un identifiant qui existe dans ma propre base de données de contacts.

+0

Essayez plusieurs fois de le faire, mais sur un vrai téléphone. Ajouter une photo, puis enregistrer, supprimer une photo puis enregistrer, encore ajouter une photo, et bien sûr il va changer – MegaManX

2

Je téléversé un exemple de la façon de créer un nouveau contact et comment le modifier

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

Pour créer un nouveau contact J'utilise:

 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) 

attention à cette ligne

let contactViewController = CNContactViewController(forNewContact: newContact) 

Pour éditer le contact J'utilise:

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

Encore une fois, faites attention à cette ligne

let contactViewController = CNContactViewController(for: contactRecord) 

Je crois que le problème est le moyen d'appeler CNContactViewController. Le constructeur est différent pour la création et l'édition. Dans la démo, vous verrez dans le journal de la console que l'identifiant du numéro de téléphone reste intact même si vous modifiez la photo ou toute autre chose.

+0

J'ai essayé votre projet et après plusieurs modifications - ajouter une photo/supprimer une photo, j'ai réussi à obtenir différents identifiants: **** contact givenName : Jhonny contacts pseudo: 0F386257-4071-4CC2-A2BE-18048F0F8F87: ABPerson identifiant numéro de téléphone: D2F8B6D5-A2ac-4194-96F9-F915294E6445 *** Contactez givenName: Jhonny contacts pseudo: 0F386257-4071-4CC2-A2BE- 18048F0F8F87: ABPerson Identifiant du numéro de téléphone: DB940E27-3ADC-42A2-8EB3-9DA7B0A7D6F4 – MegaManX

+0

@MegaManX J'ai essayé ce que vous avez dit() en supprimant une photo) et vous avez raison, l'identifiant du téléphone change. J'ai testé cela dans iOS 10 et 11 et ça se passe toujours. Puis-je demander à quoi utilisez-vous ces identifiants? Il y a peut-être une autre façon de réaliser ce dont vous avez besoin. – carlos21

+0

Je les utilise pour synchroniser avec ma base de données locale, car le numéro de téléphone n'est pas unique, c'est-à-dire que la personne peut avoir les mêmes numéros dans son compte de contact. – MegaManX