2016-08-11 106 views
2

Xamarinアプリでは、ユーザーが独自のSSOソリューションを使用してログインできるようにする必要があります。Xamarin WebViewでCookieにアクセスするにはどうすればよいですか?

私たちのiOSアプリケーションでは、Webビューのコントローラーを開いてサイトをポイントし、Cookieがサイトに表示されるまでCookieを見続けることができますしかし、XamarinではWebViewのクッキーにどのようにアクセスできるのかわかりません。私たちのXamarinアプリはWindows 8.1とWinPhone 8.1上で動作していますが、それはAndroidに拡張されるため、クロスプラットフォームのソリューションが必要です。

したがって、Xamarin WebViewでCookieにアクセスするにはどうすればよいですか?

答えて

3

PCLプロジェクトでカスタムコントロールを作成し、各プラットフォーム用のカスタムWebviewを追加する必要があります。プラットフォームのセキュリティで保護された実装では、コックが取得され、pcl-webviewから使用できます。

のAndroid上で

次のコードでクッキーを取得することができます。

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

とiOS上:githubの上

NSHttpCookieStorage storage = NSHttpCookieStorage.SharedStorage; 

ソースコードを:https://github.com/seansparkman/CookiesWebView

+1

感謝を格納しています。このプロジェクトは2歳以上で、Xamarin 1.4をターゲットにしており、Windowsプラットフォームは含まれていません。 Windows 8.1とXamarin 2.0で動作するソリューションについて知っていますか? – Simon

+0

私たちはXamarin.Forms 2.1.0.6529を使用し、それは魅力(iosとandroid)のように機能します。プロジェクトに必要な部分だけをコピーしました。 github-linkはこの問題を解決する方法を示しています。 Windowsの場合、WinPhoneコードを見て、それを採用しようとする必要があります。 – Joehl

0

のそれぞれにおけるクッキーの素晴らしいところモバイルプラットフォームは、アプリ全体で共有されているCookieコンテナです。 WebViewはCookieのプラットフォームを保持していないため、HTTPコールとWebViewのすべてがすべて同じ共有Cookieコンテナにアクセスできます。

しかし、リフレクションが必要であるため、一部のプラットフォームから抜け出すのは難しい場合があります。 SSOソリューションで最初にサインオンするWebページにアクセスする必要がある場合は、いずれも同じクッキーを共有しますので、これを行う必要はありません。

アンドロイド

のAndroidは、HTTPとのWebViewのための2個の別々のクッキーコンテナを持っています。それは奇妙なものです。したがって、あなたは、あなたがこの

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

WebViewのは、他のものを使用して行うHTTPリクエストで

using System.Net.Http; 

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

を持って、あなたが取得し、各コンテナにクッキーを設定することができます。

のiOS

この1つは簡単ですが、それらはすべて

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 
関連する問題