2012-02-22 37 views
5

Tôi muốn nhúng UIWebView vào ứng dụng MonoTouch của mình cho một khu vực chưa được triển khai thực.Đặt cookie cho các yêu cầu UIWebView

Để xác thực với trang web, tôi muốn đặt cookie chứa khóa cho phiên hiện tại.

Tôi đã thử tạo một NSDictionary với thuộc tính cho Cookie và sau đó tạo NSHttpCookie mới và thêm nó vào NSHttpCookieStorage.SharedStorage.

Rất tiếc, cookie dường như trống và không được sử dụng cho yêu cầu.

Ví dụ về cách tạo cookie với thuộc tính và nhận xét về việc đây có phải là cách đơn giản nhất để thực hiện việc này hay không sẽ được đánh giá cao.

Trả lời

3

Bất cứ khi nào tôi cần phải gửi các tập tin cookie và params đến máy chủ tôi sử dụng một cái gì đó giống như RestSharp hoặc Hammock và sau đó vượt qua giá trị response.Content vào phương pháp loadHtmlString UIWebView của:

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

API NSDictionary là khá tầm thường quá:

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

Điều này sẽ ném một 'ArgumentNullException' khi thêm cookie vào bộ nhớ, vì cookie được trả về với mã của bạn là null. – Timm

+0

Dường như tôi đã tìm thấy lỗi trên liên kết NSHttpCookie! Tôi đã nộp nó. Tôi cũng đang cập nhật câu trả lời bằng cách giải quyết. – Anuj

+0

Cảm ơn, tôi sẽ theo dõi [báo cáo lỗi] (https://bugzilla.xamarin.com/show_bug.cgi?id=3603) và thử giải pháp của bạn. – Timm

2

AFAIK mọi ứng dụng có lưu trữ cookie của riêng mình vì vậy hãy thử sử dụng mã này trước khi render trang trong 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); 

Tôi không phải là trong một MAC ngay bây giờ để im không thể kiểm tra nó hy vọng điều này giúp


sao xin lỗi, tôi đã không thể kiểm tra nó trước khi gửi bài, dù sao tôi sẽ không về nhà cho đến khi đêm nay để cung cấp cho này một 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); 

Như bạn đã nói ở trên, trong trường hợp đó không hoạt động có thể là một lỗi trên ràng buộc để MonoTouch bạn có thể gắn nó bằng tay bằng cách làm này

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

cũng đừng quên để bao gồm using MonoTouch.ObjCRuntime; nếu tự ràng buộc nó

nếu tác phẩm bằng tay gắn xin đừng quên gửi một báo cáo lỗi trên https://bugzilla.xamarin.com/

Alex

+0

Đáng buồn 'Thuộc tính', 'Tên' và' Giá trị' là chỉ đọc, vì vậy tôi không thể sử dụng API 'NSHttpCookie' cấp cao. Đó là lý do tại sao tôi không sử dụng 'NSDictionary' nhưng chưa tìm ra nội bộ, làm thế nào để thiết lập các thuộc tính cho một cookie mới. – Timm

+0

Nhiều gợi ý hay trong bài đăng của bạn: Tôi cần tiền tố OriginURL với 'http: //' và cũng đặt đường dẫn thành '/'. Cảm ơn! – Timm

0

Tôi đã viết NSMutableURLRequest + XSURLRequest catagory và XSCookie class để làm điều này ;-) http://blog.peakji.com/cocoansurlrequest-with-cookies/

+0

Xin lỗi, nhưng đây là về MonoTouch. Khái niệm chung về cách sử dụng cookie là rõ ràng, nhưng việc triển khai dường như đã có một số vấn đề. – Timm

7

Sau Anuj's bug report Tôi cảm thấy xấu về việc cần bao nhiêu dòng mã để tạo cookie. Vì vậy, các phiên bản MonoTouch tiếp theo sẽ có nhà thầu mới cho NSHttpCookie, tương tự như System.Net.Cookie mà sẽ cho phép bạn làm một cái gì đó như:

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

Bạn thậm chí sẽ có thể tạo ra một NSHttpCookie từ một NET System.Net.Cookie.

Lưu ý: Không bao giờ ngần ngại để điền vào một báo cáo lỗi khi một API chứng minh là cách phức tạp hơn nó nên :-)

0

này có thể cung cấp cho bạn một chì. Trước đây tôi đã sử dụng một chiến lược tương tự để tạo một

WebYêu cầu trang web và thu thập cookie được lưu trữ trong .Net/Mono CookieStore. Sau đó, khi tải một url trong UIWebView tôi đã sao chép các cookie đó vào 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)); 
     } 
    } 
Các vấn đề liên quan