维护Cookies UIWebView iOS Xamarin

时间:2016-01-08 04:33:07

标签: ios cookies uiwebview xamarin.ios

我有一个验证用户的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的新手。

2 个答案:

答案 0 :(得分:4)

您可以通过设置合适的到期日期来设置服务器以发出持久性cookie。 UIWebview将存储/恢复此类cookie。

您还可以通过NSHTTPCookieStorage中的UIWebView中的登录设置所有Cookie,以保存在钥匙串中的NSUserDefaults中。您可以在应用程序启动时从NSUserDefaults / keychain读取cookie,将其插入NSHttpCookieStorage,它们将可供UIWebView以及NSURLConnection,NSURLRequest等使用。

答案 1 :(得分:2)

我建议使用sfSafariViewController

SafariViewControllers可以访问Safari的cookie存储空间。 SafariViewControllers的优势在于,您可以为您处理大部分内容,并且实现非常简单。

为了安全起见,SafariViewController的沙盒来自应用程序的其余部分以保护cookie等。

但是,如果在您的网络服务中,您实施了API以重定向到附加了Cookie数据的自定义网址,例如com.app://name/bob/age/12并在您的应用中将com.app设置为custom URL scheme,然后您可以使用Cookie数据重定向回您的应用。

SafariViewControllers的优势在于,如果用户在Safari中导航到您的网站,用户仍会登录您的服务。

Here是如何实现所有这些的示例。您可以克隆此repo并运行它以自行尝试。

希望这对你有所帮助,

利安