2012-02-22 5 views
5

Я хочу вставить UIWebView в мое приложение MonoTouch для области, которая еще не реализована изначально.Установить Cookie для запросов UIWebView

Для проверки подлинности на веб-сайте я хочу установить файл cookie, содержащий ключ для текущей сессии.

Я попытался создать NSDictionary со свойствами для Cookie, а затем создать новый NSHttpCookie и добавить его в NSHttpCookieStorage.SharedStorage.

К сожалению, cookie кажется пустым и не используется для запроса.

Признак того, как построить cookie со свойствами и комментарий о том, является ли это самым простым способом сделать это, будет очень признателен.

ответ

3

Всякий раз, когда мне нужно отправить печенье и Params вплоть до сервер я использую что-то вроде RestSharp или гамаке, а затем передать значение response.Content в метод loadHtmlString UIWebView в:

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

NSDictionary API является довольно тривиальной тоже:

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

Это добавляет «ArgumentNullException» при добавлении файла cookie в хранилище, потому что cookie, возвращенный с вашим кодом, является нулевым. – Timm

+0

Кажется, я нашел ошибку в привязке NSHttpCookie! Я подал его. Я также обновляю ответ обходным путем. – Anuj

+0

Спасибо, я посмотрю на [отчет об ошибке] (https://bugzilla.xamarin.com/show_bug.cgi?id=3603) и попробую ваше решение. – Timm

2

AFAIK каждое приложение имеет свое собственное хранение печенья, поэтому постарайтесь использовать этот код перед визуализацией страницы в 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); 

Я не в MAC прямо сейчас, так им не в состоянии проверить, что надеюсь, что это помогает


хорошо извините, я не был в состоянии проверить его перед отправкой, в любом случае я не буду домой до вечера, так не дать этому спиновый

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); 

Как было указано выше, в том случае, если не работает может быть ошибка на MonoTouch связывания, так что вы можете связать его вручную, делая это

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); 

также не забудьте включить using MonoTouch.ObjCRuntime; если вручную его связывания

если вручную переплетные работы, пожалуйста, не забудьте опубликовать сообщение об ошибке на https://bugzilla.xamarin.com/

Alex

+0

К сожалению, свойства 'Domain',' Name' и 'Value' являются readonly, поэтому я не могу использовать API NSHttpCookie на высоком уровне. Вот почему я возился с «NSDictionary», но пока не понял внутренних деталей, как установить свойства для нового файла cookie. – Timm

+0

Много хороших советов в вашем посте: мне нужно было префикс OriginURL с 'http: //', а также установить путь к '/'. Благодаря! – Timm

0

Я написал NSMutableURLRequest + XSURLRequest catagory и класс XSCookie, чтобы сделать это ;-) http://blog.peakji.com/cocoansurlrequest-with-cookies/

+0

Извините, но это про MonoTouch. Общая концепция использования cookie была ясна, но, по-видимому, реализация имела некоторые проблемы. – Timm

7

Следующее Anuj's bug report Мне было плохо, сколько строк кода требуется для создания файлов cookie. Так что следующие версии MonoTouch появятся новые конструкторы для NSHttpCookie, подобные System.Net.Cookie, которые позволят вам сделать что-то вроде:

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

Вы даже сможете создать NSHttpCookie из .NET System.Net.Cookie.

Примечание: Никогда не стесняйтесь, чтобы заполнить отчет об ошибке, когда API оказывается гораздо сложнее, чем это должно быть :-)

0

Это может дать вам преимущество. Раньше я использовал аналогичную стратегию, чтобы сделать

WebRequest на сайт и собирать файлы cookie, хранящиеся в .Net/Mono CookieStore. Затем, загружая URL-адрес в UIWebView, я скопировал эти файлы cookie в 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)); 
     } 
    } 
Смежные вопросы