维护 Cookie UIWebView iOS Xamarin
Posted
技术标签:
【中文标题】维护 Cookie UIWebView iOS Xamarin【英文标题】:Maintain Cookies UIWebView iOS Xamarin 【发布时间】:2016-01-08 04:33:07 【问题描述】:我有一个对用户进行身份验证的 UIWebView。我想启用单点登录。为此,我想在用户首次通过身份验证时存储 cookie,然后在他下次启动应用程序时,cookie 应自动传递给 UIWebView 并对用户进行身份验证,而无需再次输入凭据。
我正在做类似下面的事情来使用 UIWebView
var uri = new Uri(AuthUrl);
var nsurl = new NSUrl(uri.GetComponents(UriComponents.HttpRequestUrl, UriFormat.UriEscaped));
wvLogin.LoadRequest(new NSUrlRequest(nsurl));
CookieManager.cs
public static void SaveCookies()
var cookieData = new NSMutableArray ();
var cookieStorage = NSHttpCookieStorage.SharedStorage;
foreach (var nscookie in cookieStorage.Cookies)
var cookieDictionary = new NSMutableDictionary ();
cookieDictionary.Add (NSHttpCookie.KeyName, new NSString (nscookie.Name));
cookieDictionary.Add (NSHttpCookie.KeyValue,new NSString ( nscookie.Value));
cookieDictionary.Add (NSHttpCookie.KeyDomain,new NSString ( nscookie.Domain));
cookieDictionary.Add (NSHttpCookie.KeyPath, new NSString (nscookie.Path));
cookieDictionary.Add (NSHttpCookie.KeySecure, new NSString ( nscookie.IsSecure.ToString()));
cookieDictionary.Add (NSHttpCookie.KeyVersion, new NSString (nscookie.Version.ToString()));
if (nscookie.ExpiresDate != null)
cookieDictionary.Add (NSHttpCookie.KeyExpires, nscookie.ExpiresDate);
cookieData.Add (cookieDictionary);
cookieData.WriteToFile (StoragePath(), true);
public static string StoragePath()
//var paths = NSSearchPath.GetDirectories (NSSearchPathDirectory.LibraryDirectory, NSUserDomainMask, true);
var paths = NSSearchPath.GetDirectories(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomain.User, true);
return paths [0].ToString ();
public static void DeleteCookies()
NSHttpCookieStorage cookieStorage = NSHttpCookieStorage.SharedStorage;
foreach (var nscookie in cookieStorage.Cookies)
cookieStorage.DeleteCookie(nscookie);
NSUserDefaults.StandardUserDefaults.Synchronize ();
public static void LoadCookies()
var cookies = NSMutableArray.FromFile (StoragePath());
var cookieStorage = NSHttpCookieStorage.SharedStorage;
foreach (var nscookie in cookieStorage.Cookies)
cookieStorage.SetCookie(nscookie);
LoginScreen.cs
void wvLogin_LoadFinished(object sender, EventArgs e)
int redirectCount = 0;
redirect = System.Net.WebUtility.UrlDecode(wvLogin.Request.Url.AbsoluteString);
// Do some stuff
CookieManager.SaveCookies();
else
AppDelegate.Logout();
我怎样才能做到这一点? 感谢任何帮助,因为我是 ios 和 Xamarin 的新手。
【问题讨论】:
【参考方案1】:您可以通过设置合适的到期日期来设置服务器以发出持久性 cookie。 UIWebview 将存储/恢复此类 cookie。
您还可以从 NSHTTPCookieStorage 获取所有由登录在 UIWebView 中设置的 cookie,并保存在钥匙串中的 NSUserDefaults 中。您可以在应用启动时从 NSUserDefaults/keychain 读取 cookie,将其插入到 NSHttpCookieStorage 中,它们将可供 UIWebView 以及 NSURLConnection、NSURLRequest 等使用。
【讨论】:
【参考方案2】:我建议使用sfSafariViewController。
SafariViewControllers 可以访问 Safari 的 cookie 存储。 SafariViewControllers 的优势在于您几乎可以为您处理所有事情,并且实现起来非常容易。
为了安全起见,SafariViewController 被从应用程序的其余部分沙盒化以保护 cookie 等。
但是,如果在您的网络服务中,您实现了一个 API 以重定向到带有 cookie 数据的自定义 url,例如com.app://name/bob/age/12
并在您的应用中将 com.app
设置为 custom URL scheme,然后您可以使用 cookie 数据重定向回您的应用。
SafariViewControllers 的优势在于,如果用户在 safari 中导航到您的网站,他们仍然会登录到您的服务。
Here 是如何实现这一切的一个例子。你可以克隆这个 repo 并运行它来自己尝试一下。
希望对你有帮助,
利亚姆
【讨论】:
很遗憾,没有,这是 iOS 9 中添加的新功能。sfSafariViewControllers 确实适用于以前版本的 iOS,但据我所知,cookie 访问不可用。 哦。使用 UIWebView 的任何其他解决方法?以上是关于维护 Cookie UIWebView iOS Xamarin的主要内容,如果未能解决你的问题,请参考以下文章
iOS 和 H5 页面交互(WKWebview 和 UIWebview cookie 设置)