5

我想将一个UIWebView尚未本地实现的区域嵌入到我的 MonoTouch 应用程序中。

为了通过网站进行身份验证,我想设置一个包含当前会话密钥的 cookie。

我尝试NSDictionary使用 Cookie 的属性创建一个,然后创建一个新的NSHttpCookie并将其添加到NSHttpCookieStorage.SharedStorage.

遗憾的是,cookie 似乎是空的,没有用于请求。

将不胜感激如何构建具有属性的 cookie 的示例以及关于这是否是最简单的方法的评论。

4

5 回答 5

7

在 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 被证明比它应该的复杂得多时,不要犹豫填写错误报告 :-)

于 2012-02-23T16:25:40.960 回答
3

每当我需要将 cookie 和参数发送到服务器时,我都会使用 RestSharp 或 Hammock 之类的东西,然后将 response.Content 值传递给 UIWebView 的 loadHtmlString 方法:

//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("/"));
于 2012-02-22T19:08:53.020 回答
2

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/上发布错误报告

亚历克斯

于 2012-02-22T16:05:15.937 回答
0

我已经编写了 NSMutableURLRequest+XSURLRequest 类别和 XSCookie 类来执行此操作;-) http://blog.peakji.com/cocoansurlrequest-with-cookies/

于 2012-02-23T01:59:01.603 回答
0

这可能会给你一个线索。以前我使用类似的策略来制作

WebRequest 到站点并收集存储在 .Net/Mono CookieStore 中的 cookie。然后,在 UIWebView 中加载 url 时,我将这些 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));
        }
    }
于 2015-04-01T14:11:58.597 回答