2012-02-22 9 views
5

Quiero incrustar un UIWebView en mi aplicación MonoTouch para un área que aún no se ha implementado de forma nativa.Establecer cookies para solicitudes UIWebView

Para autenticar con el sitio web, deseo establecer una cookie que contenga una clave para la sesión actual.

Intenté crear un NSDictionary con las propiedades de la Cookie y luego crear un nuevo NSHttpCookie y agregarlo al .

Lamentablemente, la cookie parece estar vacía y no se utiliza para la solicitud.

Un ejemplo de cómo crear cookies con propiedades y un comentario sobre si esta es o no la forma más sencilla de hacer esto sería muy apreciado.

Respuesta

3

Cada vez que necesito para enviar cookies y hasta el params servidor que utilizo algo como RestSharp o hamaca y luego pasar el valor response.Content en el método de loadHtmlString UIWebView:

//setup cookies and params here 
var response = client.Execute(req); 
_webView = new UIWebView(); 
_webView.LoadHtmlString(response.Content, new NSUrl(baseUrl)); 

La API NSDictionary es bastante trivial también:

var props = new NSMutableDictionary(); 
props.Add (NSHttpCookie.KeyOriginURL, new 
NSString("http://yodawg.com")); 
props.Add (NSHttpCookie.KeyName, new NSString("iherd")); 
props.Add (NSHttpCookie.KeyValue, new NSString("ulikecookies")); 
props.Add (NSHttpCookie.KeyPath, new NSString("/")); 
+0

Esto arroja una 'ArgumentNullException' cuando se agrega la cookie al almacenamiento, porque la cookie devuelta con su código es nula. – Timm

+0

¡Parece que encontré un error en el enlace NSHttpCookie! Lo archivé. También estoy actualizando la respuesta con una solución alternativa. – Anuj

+0

Gracias, echaré un vistazo al [informe de errores] (https://bugzilla.xamarin.com/show_bug.cgi?id=3603) y probaré su solución. – Timm

2

yo sepa cada aplicación tiene su propio almacenamiento de cookies a fin de tratar de utilizar este código antes de renderizar la página en el UIWebView

 NSHttpCookie cookie = new NSHttpCookie() 
     { 
      Domain = "yourdomain.com", 
      Name = "YourName", 
      Value = "YourValue" //and any other info you need to set 
     }; 
     NSHttpCookieStorage cookiejar = NSHttpCookieStorage.SharedStorage; 
     cookiejar.SetCookie(cookie); 

No estoy en un MAC en este momento por lo que no im capaz de probar que espero que esto ayuda


bien lo siento, yo no era capaz de probarlo antes de publicar, de todos modos no voy a llegar a casa hasta la noche por lo que dar una vuelta esta

var objects = new object[] { "http://yoururl.com", "CookieName", "CookieValue", "/" }; 
var keys = new object[] { "NSHTTPCookieOriginURL", "NSHTTPCookieName", "NSHTTPCookieValue", "NSHTTPCookiePath" }; 
NSDictionary properties = (NSDictionary) NSDictionary.FromObjectsAndKeys(objects, keys); 
NSHttpCookie cookie = NSHttpCookie.CookieFromProperties(properties); 
NSHttpCookieStorage.SharedStorage.SetCookie(cookie); 

Como se ha señalado anteriormente, en el caso que no funciona puede ser algún error en la unión de modo MonoTouch puede enlazar de forma manual al hacer esto

var objects = new object[] { "http://yoururl.com", "CookieName", "CookieValue", "/" }; 
var keys = new object[] { "NSHTTPCookieOriginURL", "NSHTTPCookieName", "NSHTTPCookieValue", "NSHTTPCookiePath" }; 
NSDictionary properties = (NSDictionary) NSDictionary.FromObjectsAndKeys(objects, keys); 
NSHttpCookie cookie = (NSHttpCookie) Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_IntPtr(new Class("NSHTTPCookie").Handle, new Selector("cookieWithProperties:").Handle, properties.Handle)) 
NSHttpCookieStorage.SharedStorage.SetCookie(cookie); 

también no se olvide de incluir using MonoTouch.ObjCRuntime; si manualmente enlazándolo

si funciona manualmente vinculantes por favor, no se olvide de enviar un informe de error en https://bugzilla.xamarin.com/

Alex

+0

Tristemente las propiedades 'Domain',' Name' y 'Value' son de solo lectura, así que no puedo hacer uso de una API de alto nivel' NSHttpCookie'. Es por eso que jugué con 'NSDictionary', pero aún no he descubierto las partes internas, cómo configurar las propiedades de una nueva cookie. – Timm

+0

Muchos buenos consejos en su publicación: Necesitaba prefijar el OrigenURL con 'http: //' y también configurar la ruta a '/'. ¡Gracias! – Timm

0

he escribió el NSMutableURLRequest + XSURLRequest catagory y XSCookie class para hacer esto ;-) http://blog.peakji.com/cocoansurlrequest-with-cookies/

+0

Disculpa, pero esto es sobre MonoTouch. El concepto general sobre cómo usar cookies fue claro, pero aparentemente la implementación tuvo algunos problemas. – Timm

7

Siguiendo a Anuj bug report Me sentí mal acerca de cuántas líneas de código se necesitaban para crear las cookies. Así que las próximas versiones MonoTouch tendrán nuevos constructores para NSHttpCookie, similar a System.Net.Cookie que le permitirá hacer algo como:

// this ctor requires all mandatory parameters 
// so you don't have to guess them while coding 
var cookie = new NSHttpCookie ("iherd", "ulikecookies", "/", "yodawg.com"); 

Además, podrá ser capaz de crear un NSHttpCookie de un .NET System.Net.Cookie.

Nota: Nunca dude en llenar un informe de error cuando un API demuestra ser mucho más complicado de lo que debería ser :-)

0

Esto podría darle una ventaja. Anteriormente, utilicé una estrategia similar para hacer un

WebRequest en un sitio y recopilar cookies que se almacenaban en .Net/Mono CookieStore. Luego, al cargar una url en UIWebView, copié esas cookies en NSHttpCookieStorage.

public NSHttpCookieStorage _cookieStorage; 

    /// <summary> 
    /// Convert the .NET cookie storage to the iOS NSHttpCookieStorage with Login Cookies 
    /// </summary> 
    void DotNetCookieStoreToNSHttpCookieStore() 
    { 
     foreach (Cookie c in _cookies.GetCookies(new Uri(UrlCollection["Login"], UriKind.Absolute))) { 
      Console.WriteLine (c); 
      _cookieStorage.SetCookie(new NSHttpCookie(c)); 
     } 
    } 
Cuestiones relacionadas