Création de contacts sous Windows 10

Lorsque l’on se penche sur la gestion des contacts sous Windows 10, la documentation est « un peu légère » quant à la façon d’ajouter des contacts depuis sa propre application. Ce n’est pas bien compliqué, et en examinant les exemples on trouve les informations, avec un peu de chance ce billet pourra regrouper une bonne partie des infos et proposer un exemple en TypeScript :).

Configurer le projet

La première chose à faire est, bien sûr, de définir la capacité d’accès aux contacts dans le manifeste de l’application :

ou directement en xml :

Le principe est ensuite assez simple :

  1. Obtenir un objet ContactStore en mode « écriture »
  2. Créer une liste de contact correspondant à votre application (ou la récupérer si elle existe déjà)
  3. Mettre à jour les contacts

Créer et mettre à jour les contacts

Obtenir une référence vers l’objet ContactStore est assez simple :

Lors de l’appel à la méthode requestStoreAsync

Windows.ApplicationModel.Contacts.ContactManager.requestStoreAsync(
    Windows.ApplicationModel.Contacts.
      ContactStoreAccessType.appContactsReadWrite
)

L’ajout de appContactReadWrite permet de limiter les listes de contacts disponibles aux seules listes de votre application et d’obtenir une autorisation d’écriture sur ces listes. Il existe aussi une autorisation allContactsReadWrite afin d’obtenir aussi les listes des autres applications qui ont autorisé la modification de leur contacts mais cela demandera une autorisation particulière à demander lors de la publication de votre application sur le Store.

Une fois le store récupéré, il suffit d’énumérer les listes de contacts (via findContactListsAsync) et d’identifier celle à modifier. Je n’ai pour l’instant pas trouvé mieux que le displayName pour reconnaître une liste, mais comme nous n’avons que les listes propres à notre application, cela devrait largement suffire 🙂

Si la liste n’existe pas, il faut la créer via createContactListAsync :

L’appel est assez simple pour une liste de contacts locaux, les seules choses à faire étant de décider quels droits accorder aux applications tierces. Ici j’ai choisi de donner accès à toutes les données en lecture et d’interdire la modification par les autres applications. Une fois les options modifiées, un appel à saveAsync enregistrera cette config.

Il ne reste plus ensuite qu’à obtenir les contacts que vous souhaitez mettre à jour (ici la méthode getAllFromBackEnd instancie les contacts en local, ce qui est bien sûr à remplacer par votre logique métier…) et à les synchroniser :

La suppression des contacts n’est pas encore prévue dans cette version du code, ce sera pour une prochaine release 🙂

Le code de création/mise à jour est assez simple :

  • on cherche un contact par son identifiant « externe » (via getContactFromRemoteIdAsync)
  • si il n’existe pas on instancie un nouvel objet Contact et on définit son id externe
  • on met à jour tous les champs intéressants du contact
  • on appelle la saveContactAsync pour valider les modifications

Et voilà le résultat :

Vous pouvez retrouver le code complet de ce billet sur GitHub: https://github.com/mcarbenay/contact-list-sample