维护 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 中UIWebView的cookie

iOS6 UIWebView 中的第 3 方 cookie

iOS 和 H5 页面交互(WKWebview 和 UIWebview cookie 设置)

iOS开发WKWebView Cookie的读取与写入,与UIWebView的Cookie共享

iOS UIWebView在HTML中丢失了cookie

iOS UIWebView 允许所有三方cookie