Установить Cookie для запросов UIWebView - PullRequest
5 голосов
/ 22 февраля 2012

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

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

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

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

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

Ответы [ 5 ]

7 голосов
/ 23 февраля 2012

После сообщения об ошибке Anuj Мне стало плохо от того, сколько строк кода понадобилось для создания файлов 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 оказывается намного сложнее, чем должно быть: -)

3 голосов
/ 22 февраля 2012

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

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

API NSDictionary также довольно тривиален:

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("/"));
2 голосов
/ 22 февраля 2012

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

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

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 голосов
/ 01 апреля 2015

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

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

Я написал для этого категорию NSMutableURLRequest + XSURLRequest и класс XSCookie ;-) http://blog.peakji.com/cocoansurlrequest-with-cookies/

...