2016-08-11 1 views
2

Dans notre application Xamarin, nous devons permettre à nos utilisateurs de se connecter en utilisant leur propre solution SSO. La façon dont cela fonctionne dans notre application iOS est que nous ouvrons un contrôleur avec une vue Web et le point sur notre site, et continuons à regarder les cookies jusqu'à ce qu'ils soient de retour sur notre site avec le cookie qui indique qu'ils Je suis connecté. Mais dans Xamarin, je ne vois pas comment accéder aux cookies pour le WebView. Notre application Xamarin fonctionne sur Windows 8.1 et WinPhone 8.1, mais elle sera étendue à Android à un moment donné, j'ai donc besoin d'une solution multiplateforme. Alors, comment accéder aux cookies dans un WebView Xamarin?Comment accéder aux cookies dans un WebView Xamarin?

Répondre

3

Vous devez créer un contrôle personnalisé dans votre projet PCL, puis ajouter une vue Web personnalisée pour chaque plate-forme. La mise en œuvre de la plate-forme obtient alors les coocks et vous pouvez l'utiliser depuis votre pcl-webview.

Sur Android, vous pouvez obtenir les biscuits avec le code suivant:

var cookieHeader = CookieManager.Instance.GetCookie(url); 

Et sur iOS:

NSHttpCookieStorage storage = NSHttpCookieStorage.SharedStorage; 

Sourcecode sur github: https://github.com/seansparkman/CookiesWebView

+1

Merci. Ce projet a plus de 2 ans, cible Xamarin 1.4 et ne contient pas de plateforme Windows. Connaissez-vous une solution compatible avec Windows 8.1 et Xamarin 2.0? – Simon

+0

Nous utilisons Xamarin.Forms 2.1.0.6529 et il fonctionne comme un charme (iOS et Android). Nous avons simplement copié les pièces dont nous avions besoin pour notre projet. Le lien github montre juste, comment résoudre ce problème. Pour Windows, vous devez regarder le code WinPhone et essayer de l'adopter. – Joehl

0

La grande chose au sujet des cookies dans chacun des les plates-formes mobiles sont des conteneurs de cookies partagés à travers l'application. Le WebView ne contient pas les cookies de la plate-forme et, par conséquent, même les appels HTTP et les différents WebView peuvent tous accéder au même conteneur de cookies partagés.

Cependant, ils peuvent être difficiles à retirer de certaines plates-formes, dans la mesure où une réflexion est nécessaire. Si votre solution SSO exige uniquement que les utilisateurs se connectent d'abord aux pages Web, ils partagent tous les mêmes cookies et vous n'avez rien à faire.

Android

Android dispose de 2 conteneurs de cookies séparés pour HTTP et WebView de. C'est l'étrange. Par conséquent, vous avez

using System.Net.Http; 

    private static CookieContainer _cookieContainer = new System.Net.CookieContainer(); 
    private static Android.Webkit.CookieManager _cookieManager = Android.Webkit.CookieManager.Instance; 

Avec les requêtes HTTP vous faites cela

HttpClient client = new HttpClient(new HttpClientHandler() { CookieContainer = cookieContainer }); 

Le WebView utilise l'autre et vous pouvez obtenir et définir des cookies dans chaque conteneur.

iOS

Celui-ci est facile, ils sont tous stockés dans

NSHttpCookieStorage.SharedStorage.Cookies 

WinRT

using Windows.Web.Http; //NOT: Microsoft.Net.Http 

var filter = new HttpBaseProtocolFilter(); 
HttpClient client = new HttpClient(filter); 

// Use this, while it comes from an instance, its shared across everything. 
filter.CookieManager