2011-05-10 2 views
69

मेरे पास एक आईओएस एप्लिकेशन के अंदर वेबव्यू हैं जिनके लिए प्रमाणीकरण कुकी को उचित रूप से प्रमाणित करने की आवश्यकता होती है। मैं कुकी सेट करने के लिए आउटबाउंड अनुरोध किए बिना आईओएस एप्लिकेशन के वेबव्यू के अंदर एक कुकी सेट करने का एक तरीका ढूंढ रहा हूं क्योंकि मेरे पास पहले से ही क्लाइंट पर ऑथ जानकारी है।क्या UIWebView के लिए SharedHTTPCookieStorage का उपयोग करके कुकी को मैन्युअल रूप से सेट करना संभव है?

यह post जहां UIWebView कुकीज़ जमा हो जाती है हमें पता चलता है।

अभी मैं एक आउटबाउंड अनुरोध करने के लिए एक छिपा वेब दृश्य लोड हो रहा रहा हूँ, लेकिन एक साधारण कुकी स्थापित करने के लिए एक बाहरी अनुरोध करने के लिए देखना पसंद नहीं करते हैं।

उत्तर

128

हाँ, आप ऐसा कर सकते हैं। सबसे पहले, applicationDidBecomeActive में इस लाइन

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; 

cookieAcceptPolicy एप्लिकेशन में साझा किया जाता है और आपकी जानकारी के बिना बदला जा सकता है जोड़ने के लिए, तो क्या आप वाकई नीति को स्वीकार जब भी आपका एप्लिकेशन चल रहा है की जरूरत है होना चाहता हूँ।

फिर, कुकी सेट करने के लिए:

NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary]; 
[cookieProperties setObject:@"testCookie" forKey:NSHTTPCookieName]; 
[cookieProperties setObject:@"someValue123456" forKey:NSHTTPCookieValue]; 
[cookieProperties setObject:@"www.example.com" forKey:NSHTTPCookieDomain]; 
[cookieProperties setObject:@"www.example.com" forKey:NSHTTPCookieOriginURL]; 
[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath]; 
[cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion]; 

// set expiration to one month from now or any NSDate of your choosing 
// this makes the cookie sessionless and it will persist across web sessions and app launches 
/// if you want the cookie to be destroyed when your app exits, don't set this 
[cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires]; 

NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties]; 
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie]; 

यह कुकी नाम testCookie और मूल्य someValue123456 है और www.example.com के लिए किसी भी http अनुरोध के साथ भेज दिया जाएगा।

एक बड़ी चेतावनी के लिए कुकी सेट करने के लिए, कृपया मेरे सवाल यहाँ देख!

NSHTTPCookieStorage state not saved on app exit. Any definitive knowledge/documentation out there?

+0

एनएसएचटीटीपीकी स्टोरेज निश्चित रूप से एक सतत कुकी स्टोरेज को पूरी तरह कार्यान्वित करता है। यह सर्वर-साइड पर कुकी जीवनकाल को सही ढंग से सेट करने का मामला है। – Till

+0

हां यह एक सतत कुकी भंडारण को लागू करता है। केवल समस्या यह विफल हो जाती है जब ऐप कुकी सेट होने के तुरंत बाद छोड़ देता है। – kball

+1

बॉल, हम इस समाधान के साथ जा रहे हैं जो आपके उत्तर के बहुत करीब है: http://lists.apple.com/archives/Webkitsdk-dev/2003/Sep/msg00003.html –

14

संपादित करें: संपादित सवाल

NSHTTPCookieStorage के लिए अनुकूल एक -setCookies:forURL:mainDocumentURL: विधि है, ऐसा करने के लिए आसान बात NSURLConnection का उपयोग करें और -connection:didReceiveResponse: लागू, कुकीज़ निकालने और उन्हें कुकी जार में भरने है:

- (void)connection: (NSURLConnection *)connection 
      didReceiveResponse: (NSURLResponse *)response 
{ 
    NSHTTPURLResponse  *httpResponse = (NSHTTPURLResponse *)response; 
    NSArray     *cookies; 

    cookies = [ NSHTTPCookie cookiesWithResponseHeaderFields: 
          [ httpResponse allHeaderFields ]]; 
    [[ NSHTTPCookieStorage sharedHTTPCookieStorage ] 
      setCookies: cookies forURL: self.url mainDocumentURL: nil ]; 
} 

(तुम भी बस properties साथ NSHTTPCookie से एक NSDictionary वस्तु निकाल सकते हैं, और उसके बाद डिस्क के लिए शब्दकोश में लिखें। यह पढ़ना पीठ में का उपयोग कर के रूप में के रूप में आसान है । NSDictionary के -dictionaryWithContentsOfFile: और फिर -initWithProperties: साथ कुकी बनाने)

तो फिर तुम कुकी वापस भंडारण से बाहर खींच सकते हैं जब आपको उसकी आवश्यकता:

- (void)reloadWebview: (id)sender 
{ 
    NSArray     *cookies; 
    NSDictionary   *cookieHeaders; 
    NSMutableURLRequest  *request; 

    cookies = [[ NSHTTPCookieStorage sharedHTTPCookieStorage ] 
       cookiesForURL: self.url ]; 
    if (!cookies) { 
     /* kick off new NSURLConnection to retrieve new auth cookie */ 
     return; 
    } 

    cookieHeaders = [ NSHTTPCookie requestHeaderFieldsWithCookies: cookies ]; 
    request = [[ NSMutableURLRequest alloc ] initWithURL: self.url ]; 
    [ request setValue: [ cookieHeaders objectForKey: @"Cookie" ] 
       forHTTPHeaderField: @"Cookie" ]; 

    [ self.webView loadRequest: request ]; 
    [ request release ]; 
} 
+1

मैन्युअल NSHTTPCookieStorage इस तरह से प्रबंधन करने के लिए कोई जरूरत नहीं है। किसी भी समय यूआरएल लोडिंग सिस्टम HTTP का उपयोग कर रहा है और कुकी स्वीकृति नीति कुकीज़ स्वीकार करने के लिए सेट है, NSHTTPCookieStorage स्वचालित रूप से प्रबंधित किया जाता है - प्रतिक्रिया हेडर में सेट होने पर कुकीज़ संग्रहीत करना, और अनुरोध भेजते समय संग्रहीत कुकीज़ के लिए शीर्षलेख सेट करना। – kball

+0

निश्चित रूप से। बेशक, उस दृष्टिकोण का अर्थ है कि डेवलपर अज्ञात है कि कुकीज़ को किस प्रकार से सहेजा जाता है और प्रत्येक अनुरोध के साथ भेजा जाता है, जो अवांछित ट्रैकिंग कुकीज़ सेट कर रहा है, तो अवांछित हो सकता है। NSHTTPCookieStorage का उपयोग करना हेवीवेट समाधान भी हो सकता है, हालांकि आम तौर पर केवल मैक ओएस एक्स पर। उदाहरण के लिए, देखें: http://www.cocoabuilder.com/archive/cocoa/169235-nsurlconnection-without-nshttpcookiestorage.html –

+1

सराहना लंबा जवाब, हालांकि यह एक कुकी सेट करने के लिए काफी मात्रा में काम प्रतीत होता है। हमने ऐसा करने के लिए समाप्त किया: http://lists.apple.com/archives/Webkitsdk-dev/2003/Sep/msg00003.html –

1

आईओएस 10 है, जो उन्हें विभिन्न प्रक्रियाओं के लिए अदृश्य बनाता है द्वारा शुरू की गई कुकीज़ पर सीमाओं के आसपास काम करने की जरूरत नहीं है।

इसका मतलब है कि मल्टीप्रोसेसिंग क्षमता वाले उपकरणों पर, वेबव्यू एक अलग प्रक्रिया है, फिर आपका ऐप, जिसका अर्थ है कि आपका "ऐप" सत्र अब वेबव्यू पर स्वचालित रूप से प्रेषित नहीं होता है।

तो सार में, आप इसे करने की आवश्यकता होगी (यहां तक ​​कि पिछले पोस्टर जहां सही, यह iOS10 से पहले स्वचालित रूप से काम कर रहा था) है।

3

स्विफ्ट 3 चाबियों का कुल मिलाकर HTTPCookiePropertyKey struct में लिपटे रहे हैं:

let cookieProperties: [HTTPCookiePropertyKey : Any] = [.name : "name", 
                 .value : "value", 
                 .domain : "www.example.com", 
                 .originURL : "www.example.com", 
                 .path : "/", 
                 .version : "0", 
                 .expires : Date().addingTimeInterval(2629743) 
                 ] 

if let cookie = HTTPCookie(properties: cookieProperties) { 
    HTTPCookieStorage.shared.setCookie(cookie) 
}