Set Cookie for UIWebView requests

前端 未结 5 1748
抹茶落季
抹茶落季 2021-01-05 18:54

I want to embed an UIWebView into my MonoTouch application for an area that is not yet implemented natively.

In order to authenticate with the website I

相关标签:
5条回答
  • 2021-01-05 19:20

    Following Anuj's bug report I felt bad about how many lines of code were required to create the cookies. So the next MonoTouch versions will have new constructors for NSHttpCookie, similar to System.Net.Cookie that will allow you do to something like:

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

    You'll even be able to create a NSHttpCookie from a .NET System.Net.Cookie.

    Note: Never hesitate to fill a bug report when an API proves to be way more complicated than it should be :-)

    0 讨论(0)
  • 2021-01-05 19:29

    Whenever I need to send cookies and params up to the server I use something like RestSharp or Hammock and then pass the response.Content value into UIWebView's loadHtmlString method:

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

    The NSDictionary API is fairly trivial too:

    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 讨论(0)
  • 2021-01-05 19:33

    AFAIK every application has its own cookie storage so try to use this code before rendering the page in the 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);
    

    I'm not in a MAC right now so im not able to test it hope this helps


    okay sorry, i wasn't able to test it before posting, anyways I won't get home until tonight so give this a spin

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

    As you stated above, in the case that doesn't work might be a bug on monotouch binding so you can bind it manually by doing this

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

    also don't forget to include using MonoTouch.ObjCRuntime; if manually binding it

    if manually binding works please don't forget to post a bug report on https://bugzilla.xamarin.com/

    Alex

    0 讨论(0)
  • 2021-01-05 19:44

    This might give you a lead. Previously I used a similar strategy to make a

    WebRequest to a site and collect cookies which were stored in the .Net/Mono CookieStore. Then when loading a url in the UIWebView I copied those cookies over to the 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 讨论(0)
  • 2021-01-05 19:45

    I’ve wrote the NSMutableURLRequest+XSURLRequest catagory and XSCookie class to do this;-) http://blog.peakji.com/cocoansurlrequest-with-cookies/

    0 讨论(0)
提交回复
热议问题