Dot.Blog

C#, XAML, Xamarin, UWP/Android/iOS

Xamarin.Forms : Partager des informations

Partager des informations est essentiel, toute App bien conçue devrait le proposer. Et c’est si simple avec Xamarin.Essentials…

Partager pour exister

Partager c’est bien, c’est grand, c’est altruiste, humaniste et tout ça, mais c’est surtout indispensable pour communiquer. Mais ici nos visées sont philosophiquement malgré tout bien moins haute, peut-être moins noble mais pas moins essentielles pour autant !

En effet une App qui ne sait pas partager ses données est en quelque sorte comme un patient souffrant d’un syndrome de locked-in … Il veut parler, il veut s’exprimer, bouger, mais il reste figé. Le cerveau dans une App c’est vous. Et quand vous utilisez une App fermée c’est vous qui soufrez de cet enfermement forcé…

En termes d’UX la frustration peut être immense. J’ai là sous les yeux une photo, un graphique, une fiche client, mais hélas rien n’est fait pour les partager et les envoyer ailleurs, à moi-même pour traiter l’info sur mon PC, à des collaborateurs par SMS ou WhatsApp, ou d’autres Apps que j’ai dans mon smartphone (Facebook, Skype, téléprompteur… que sais-je !).

Les développeurs sous-estiment trop souvent l’UX se contentant de coder des méthodes et des objets mais pas des Apps pour ce qu’elles sont vraiment, c’est à dire des outils conçus pour des humains qui cherchent à se simplifier la vie pour accomplir des tâches variées. Or dès qu’une App est publiée elle échappe à ses créateurs pour devenir l’objet de chaque utilisateur. Chacun dans son contexte, sa vie, ses urgences, ses besoins. Et si tout cela semble très vaste et très mouvant, une constante peut se dégager : pouvoir extraire à tout moment les informations détenues par une App pour les partager avec d’autres Apps et d’autres personnes via toute une palette de “passerelles” comme les softs que je citais plus haut.

C’est donc bien au cœur même de ce qui fait une App que nous nous intéressons aujourd’hui. La fonction “Partager” devrait devenir aussi commune et ubiquitaire que le “copier/coller”.

Pour une App comme un humain, Partager c’est Exister.

Et c’est pourquoi bien que le code de démo soit modeste j’ai décidé d’accorder toute sa place à cette fonction, avant tout pour en parler, la remettre au centre de vos préoccupations quand vous écrivez une App.

Xamarin.Essentials

Nous n’allons ici rien inventer. Nous allons puiser dans cette réserve extraordinaire que sont les Xamarin.Essentials qui fourmille d’API toutes plus utiles les unes que les autres.

Vous trouverez la documentation complète des Xamarin.Essentials ici : https://docs.microsoft.com/fr-fr/xamarin/essentials/

L’API qui nous intéresse plus particulièrement s’appelle tout naturellement “Share”.

C’est techniquement une classe du Namespace Xamarin.Essentials.

Les informations partageables

Share est capable de partager trois types d’information :

  • Du texte
  • Des URI
  • Des fichiers

Tout passe par la même API mais c’est l’objet en paramètre de la méthode de partage qui sera différent. Il en existe au moins deux actuellement : l’un pour le texte et les URI, l’autre pour les fichiers.

Partager du texte ou des URI

Le code suivant montre les deux cas d’utilisation (partage de texte puis partage d’une URI).


public class ShareTest
{
    public async Task ShareText(string text)
    {
        await Share.RequestAsync(new ShareTextRequest
            {
                Text = text,
                Title = "Share Text"
            });
    }

    public async Task ShareUri(string uri)
    {
        await Share.RequestAsync(new ShareTextRequest
            {
                Uri = uri,
                Title = "Share Web Link"
            });
    }
}

Les deux exemples sont présentés dans une classe de démo “ShareText” qui expose deux méthodes dont le contenu a été spécialisé en fonction du choix de l’envoi d’un texte ou d’une URI.

Mais si le même objet ShareTextRequest est utilisé c’est qu’il est possible en réalité de mixer les deux types d’information en même temps : texte + URI. C’est alors la plateforme et les logiciels cibles qui feront le choix de l’information la mieux adaptée à leur fonctionnement.

Partager des fichiers

Il s’agit bien ici de partager des fichiers “disque” (si cela veut encore dire quelque chose dans un smartphone !) avec “l’extérieur”. Donc des informations stockées sur le smartphone (la tablette…) et qui sont accessibles à l’App, généralement parce que ce sont justement des données qu’elle a créées ou stockées.

Le mécanisme est tout aussi redoutablement simple :


await Share.RequestAsync(new ShareFileRequest
{
    Title = Title,
    File = new ShareFile(file),
    PresentationSourceBounds = DeviceInfo.Platform== DevicePlatform.iOS && DeviceInfo.Idiom == DeviceIdiom.Tablet
                            ? new System.Drawing.Rectangle(0, 20, 0, 0)
                            : System.Drawing.Rectangle.Empty
});

On note que cette fois c’est un objet “ShareFileRequest” qui est utilisé.

On notera aussi que l’API elle-même est Asynchrone et qu’il est nécessaire de faire un await.

Nuances

Il existe des nuances de comportement entre les plateformes. Sous Android la propriété Subject permet comme on s’en doute d’indiquer le sujet d’un message transmis alors que sous iOS cette information sera ignorée, de même que Title. Alors que sous UWP Title est par défaut le nom de l’application si aucune valeur n’est précisée. Et là aussi Subject sera ignoré.

Il est bon de connaître ces petites nuances pour garantir une UX agréable sur toutes les plateformes !

Conclusion

Je ne vais pas en faire des tonnes car l’API est bien documentée et qu’il existe même des vidéos de présentation sur Channel 9. Le but clairement affiché ici est de vous faire réfléchir à l’importance de la fonction de partage dans vos Apps afin que vous n’oubliiez pas de l’intégrer dans vos plans… Vous auriez trouvé certainement un peu court que je ne donne pas un ou deux exemples mais ce n’était pas le sujet. Car, grâce aux Xamarin.Essentials le plus gros du job est fait… Il faut donc juste y penser…

Stay Tuned !

blog comments powered by Disqus