Dans ce mini-hack vous utiliserez l'API de Twitter pour rechercher et afficher des tweets dans une application multiplateforme Xamarin.
Le but est d'implémenter rapidement l'API Twitter et de jouer avec Xamarin.Forms pour les afficher sur toutes les plateformes.
Le tutoriel ci-dessous vous guidera pour récupérer tweets et utilisateurs, mais après cette base posée vous êtes libre de laisser votre imagination s'envoler et d'afficher vos tweets différemment. N'hésitez pas à tweeter @framinosona, @edwigeseminara, @cderue ou @benjiiim pour tester vos clients twitter ;)
Pour ce challenge vous aurez besoin de soit :
- Visual Studio 2015 (Avec les outils Xamarin installés et à jour)
- Xamarin Studio
Pour bien commencer, il faut s'assurer que la solution de départ se lance correctement dans votre environnement. Pour cela :
- Ouvrez TwitterClient.sln
- Sélectionnez le projet de démarrage et le device de déploiement
- Démarrez le projet
Afin d'accéder aux APIs de Twitter il faut se procurer des identifiants auprès de Twitter :
- Allez sur https://apps.twitter.com/
- Cliquez sur "Create New App"
- Renseignez le nom de votre application, sa description et un website (ce champ n'est pas important)
- Vous arrivez sur la page de gestion de votre App Twitter.
- Rendez-vous dans Keys and Access Tokens
- Dans Application Settings copiez-collez sur votre bloc note favori les Consumer Key (API Key) et Consumer Secret (API Secret)
- Plus bas dans la page, dans Your access token, cliquez sur Create my access token
- Copiez-coller également les Access Token et Access Token Secret
L'application a besoin de ces identifiants pour questionner l'API Twitter :
- Dans TwitterClient, ouvrez TwitterCredentials.cs
- Renseignez vos informations récupérées aux étapes précédentes.
Vous noterez l'appel dans App.xaml.cs > OnStart() de TwitterApi.Instance.SetCredentials() au démarrage de l'application.
Afin de simplifier cet exercice nous avons préparé cette DLL qui permet 3 types de requetes Twitter :
- Rechercher des utilisateurs TwitterAPI.SearchUserAsync()
- Rechercher des tweets TwitterAPI.SearchTweetsAsync(ResultType)
- Rechercher les tweets récents TwitterAPI.ResultType.Recent
- Rechercher les tweets populaires TwitterAPI.ResultType.Popular
- Rechercher un mélange des 2 TwitterAPI.ResultType.Mixed
- Rechercher les tweets d'un utilisateur TwitterAPI.SearchTweetsOfUserAsync()
Vous pouvez alors utiliser :
// Récupérer les 30 derniers tweets avec le mot clé "Xamarin"
var Statuses = await TwitterAPI.TwitterApi.Instance.SearchTweetsAsync("Xamarin", 30, ResultType.Recent);
// Récupérer les 10 derniers tweets de l'utilisateur @Cellenza
var Statuses = await TwitterAPI.TwitterApi.Instance.SearchTweetsOfUserAsync("Cellenza", 10);
...
Attention : il y a des limitations en nombre d'appels. Nous vous invitons à vous en référer aux documentations ci-dessous et à ne pas lancer 3000 appels par seconde.
Si vous observez MainPage.xaml vous remarquerez que nous avons déjà changé ContentPage en TabbedPage pour vous. (You're welcome ;) )
L'objectif est donc de faire une application qui permet :
- Dans le panneau "Search" de rechercher des tweets
- Dans le panneau "User" de rechercher des utilisateurs
Ajoutez à l'intérieur du ContentPage "Search" :
<StackLayout HorizontalOptions="Fill" VerticalOptions="Fill">
<SearchBar x:Name="TweetsSearchBar"
HorizontalOptions="Fill"
SearchButtonPressed="RefreshSearch"></SearchBar>
<ListView x:Name="TweetsList"
HorizontalOptions="Fill"
HasUnevenRows="True"
IsPullToRefreshEnabled="True"
Refreshing="RefreshSearch">
<ListView.ItemTemplate>
<DataTemplate>
<ImageCell ImageSource="{Binding Path=User.ProfileImageUrl}"
Text="{Binding Path=Text}"
Detail="{Binding Path=User.ScreenName, StringFormat='@{0}'}"></ImageCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
Nous avons mis dans notre XAML des événements. SearchButtonPressed et Refreshing pour être précis. Ils appellent tous les deux RefreshSearch. Ajoutez donc dans votre MainPage.xaml.cs :
private async void RefreshSearch(object sender, EventArgs e)
{
TweetsList.IsRefreshing = true;
// TODO : Récupérer la liste des tweets correspondant au TweetsSearchBar.Text et les ajouter à TweetsList.ItemsSource
TweetsList.IsRefreshing = false;
}
(On vous laisse remplir ;) )
Ajoutez à l'intérieur du ContentPage "User" :
<StackLayout HorizontalOptions="Fill" VerticalOptions="Fill">
<SearchBar x:Name="UserSearchBar"
HorizontalOptions="Fill"
SearchButtonPressed="RefreshUsers"></SearchBar>
<ListView x:Name="UsersList"
HorizontalOptions="Fill"
HasUnevenRows="True"
IsPullToRefreshEnabled="True"
Refreshing="RefreshUsers">
<ListView.ItemTemplate>
<DataTemplate>
<ImageCell ImageSource="{Binding Path=ProfileImageUrl}"
Text="{Binding Path=ScreenName, StringFormat='@{0}'}"></ImageCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
Idem dans votre MainPage.xaml.cs :
private async void RefreshUsers(object sender, EventArgs e)
{
UsersList.IsRefreshing = true;
// TODO : Récupérer la liste des utilisateurs correspondant au UserSearchBar.Text et les ajouter à UsersList.ItemsSource
UsersList.IsRefreshing = false;
}
- Customisez votre application à fond !
- Icone d'application
- Couleurs & Fonds
- Informations affichées dans les listes
- Faites la même chose en Xamarin.Android et Xamarin.iOS
- Au clic sur un utilisateur, naviguez vers une page affichant les informations de l'utilisateur et ses derniers tweets.
"This version of Xamarin.iOS requires the iOS 10.0 SDK (shipped with Xcode 8.0) when the managed linker is disabled. Either upgrade Xcode, or enable the managed linker."
Comme indiqué, le XCode détecté sur le Mac de déploiement n'est pas à jour. 2 solutions possibles :
- Mettre à jour XCode sur ce Mac
- Dans Solution iOS > Paramètres > iOS Build > Linker behavior sélectionner "Link SDK Assemblies Only"
Tout le code de ma solution Android est rouge.
Il s'agit d'un bug connu lorsqu'on utilise VS et Xamarin. Fermez Visual Studio, aller jusqu'à la racine de votre projet et supprimez le dossier /.vs . Relancez VS et votre Android est compris.
"Resource.Layout.Tabbar" et "Resource.Layout.Toolbar" ne sont pas trouvés
Android a besoin d'une première compilation avant de pouvoir développer. Générez votre projet Android.
Tout le code (y compris le XAML) est rouge.
Vous avez surement oublié de récupérer les pacquets NuGets. Rendez-vous dans Outils/Tools > Gestionnaire de packages NuGet/Nuget packages manager > Gérer les packages NuGet pour la solution .../Manage Nuget packages for solution ... et cliquez sur le bandeau jaune qui apparait.