2012-02-22 16 views
5

मैं अपने मोनो टच एप्लिकेशन में UIWebView को उस क्षेत्र के लिए एम्बेड करना चाहता हूं जो अभी तक लागू नहीं हुआ है।UIWebView अनुरोधों के लिए कुकी सेट करें

वेबसाइट के साथ प्रमाणित करने के लिए मैं वर्तमान सत्र के लिए एक कुंजी युक्त एक कुकी सेट करना चाहता हूं।

मैंने कुकी के गुणों के साथ NSDictionary बनाने की कोशिश की और फिर एक नया NSHttpCookie बनाएं और इसे NSHttpCookieStorage.SharedStorage पर जोड़ें।

अफसोस की बात है कि कुकी खाली दिखाई देती है और अनुरोध के लिए उपयोग नहीं की जाती है।

संपत्तियों के साथ कुकी बनाने के तरीके का एक उदाहरण और इस पर टिप्पणी करने के लिए यह सबसे आसान तरीका है या नहीं, इस पर एक टिप्पणी की सराहना की जाएगी।

उत्तर

3

एक बग रिपोर्ट पोस्ट करने के लिए मत भूलना कृपया अगर जब भी मैं करने के लिए कुकीज़ और पैरामीटर भेजने की जरूरत है सर्वर मैं RestSharp या झूला की तरह कुछ का उपयोग करें और फिर UIWebView के loadHtmlString विधि में response.Content मान पास:

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

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("/")); 
+0

यह कुकी को स्टोरेज में जोड़ने के दौरान 'ArgumentNullException' फेंकता है, क्योंकि आपके कोड के साथ कुकी वापस आ गई है। – 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); 

मैं अभी ऐसा नहीं im परीक्षण करने के लिए यह इस आशा में सक्षम एक मैक में नहीं कर रहा हूँ में पृष्ठ को प्रदर्शित करने से पहले इस कोड का उपयोग करने की कोशिश है मदद करता है


ठीक क्षमा करें, मैं पोस्ट करने से पहले यह परीक्षण करने के लिए, वैसे भी मैं घर नहीं मिलेगा जब तक आज रात तो यह एक त्वरित समीक्षा में सक्षम नहीं था

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

आप using MonoTouch.ObjCRuntime; शामिल करने के लिए करता है, तो मैन्युअल रूप से इसे बाध्यकारी ऊपर कहा गया है के रूप में ऐसा होता है कि काम नहीं करता है 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); 

करके इसे मैन्युअल रूप से बाध्य कर सकते हैं हो सकता है यह भी भूल नहीं है में,

मैन्युअल बाध्यकारी कार्यों पर https://bugzilla.xamarin.com/

एलेक्स

+0

दुख की बात है कि 'डोमेन', 'नाम' और' मान' गुण केवल पढ़े जाते हैं, इसलिए मैं उच्च-स्तर 'NSHttpCookie' API का उपयोग नहीं कर सकता। यही कारण है कि मैं 'NSDictionary' के साथ झुका हुआ हूं लेकिन अभी तक आंतरिक नहीं पाया है, एक नई कुकी के लिए गुण कैसे सेट करें। – Timm

+0

आपकी पोस्ट में कई अच्छे संकेत: मुझे OriginURL को 'http: //' के साथ उपसर्ग करने की आवश्यकता है और पथ को '/' पर सेट भी करना है। धन्यवाद! – Timm

0

मैं NSMutableURLRequest लिखा गया है + XSURLRequest catagory और XSCookie क्लास ऐसा करने के लिए ;-) http://blog.peakji.com/cocoansurlrequest-with-cookies/

+0

क्षमा करें, लेकिन यह मोनो टच के बारे में है। कुकीज़ का उपयोग करने के तरीके पर सामान्य अवधारणा स्पष्ट थी, लेकिन कार्यान्वयन में कुछ समस्याएं थीं। – Timm

7

अनुज के bug report के बाद मुझे बुरा लगा कि कुकीज़ बनाने के लिए कितने कोड की आवश्यकता थी।

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

तुम भी एक नेट System.Net.Cookie से एक NSHttpCookie बनाने के लिए सक्षम हो जाएगा: तो अगले MonoTouch संस्करणों NSHttpCookie के लिए नए निर्माताओं, System.Net.Cookie के समान है कि आप की तरह कुछ करने के लिए क्या अनुमति देगा होगा।

नोट: कभी नहीं एक बग रिपोर्ट को भरने के लिए संकोच जब एक API जितना होना चाहिए उस :-)

0

यह आपको एक का नेतृत्व दे सकता है जिस तरह से और अधिक जटिल साबित होता है। पहले मैंने

किसी साइट पर WebRequest बनाने और नेट/मोनो कुकीस्टोर में संग्रहीत कुकीज़ एकत्र करने के लिए एक समान रणनीति का उपयोग किया था। फिर 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)); 
     } 
    } 
संबंधित मुद्दे