2016-01-08 15 views
13

Ho un UIWebView che autentica un utente. Voglio abilitare il singolo accesso. Per questo voglio memorizzare i cookie quando l'utente viene autenticato per la prima volta e quindi al prossimo avvio dell'app, i cookie dovrebbero essere automaticamente passati a UIWebView e autenticare l'utente senza che egli inserisca nuovamente le sue credenziali.Mantieni cookie UIWebView iOS Xamarin

Iam facendo qualcosa di simile al di sotto di utilizzare l'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(); 
    } 
    } 
    } 

Come posso raggiungere questo obiettivo? Qualsiasi aiuto è apprezzato come Iam nuovo per iOS e Xamarin.

risposta

4

È possibile impostare il server in modo che emetta un cookie permanente impostando una data di scadenza adeguata. UIWebview memorizzerà/ripristinerà tali cookie.

È inoltre possibile ottenere tutti i cookie impostati dall'accesso in UIWebView da NSHTTPCookieStorage come salvato in NSUserDefaults nel portachiavi. Si potrebbe leggere i cookie dal NSUserDefaults/keychain sul lancio app, inserire lo stesso in NSHttpCookieStorage e saranno disponibili per l'utilizzo da parte UIWebView e anche il NSURLConnection, NSURLRequest ecc

2

Ti consiglio di utilizzare una sfSafariViewController.

SafariViewControllers ha accesso alla memoria dei cookie di Safari. Il vantaggio di SafariViewControllers è che per lo più tutto è gestito per te e l'implementazione è estremamente semplice.

Per SafariViewController sicurezza del sandbox vengono dal resto delle app per proteggere i cookie ecc

Ma se nel vostro webservice di implementare un'API per reindirizzare a un URL personalizzato con i dati dei cookie attaccato per esempio com.app://name/bob/age/12 e hai impostato com.app come custom URL scheme nella tua app, quindi puoi reindirizzare alla tua app con i dati dei cookie.

Il vantaggio di SafariViewControllers è che l'utente sarà comunque connesso al servizio se dovesse navigare nel sito Web in safari.

Here è un esempio di come implementare tutto questo. Puoi clonare questo repository ed eseguirlo per provarlo per te.

Spero che questo è utile a voi,

Liam

+0

Grazie per la risposta. Funzionerebbe per iOS 8? –

+0

Purtroppo no, si tratta di nuove funzionalità aggiunte con iOS 9. sfSafariViewControllers funziona con le versioni precedenti di iOS, ma l'accesso ai cookie non è per quanto ne so. –

+0

Oh. Qualche altra soluzione per questo usando UIWebView? –

Problemi correlati