2011-12-19 19 views
15

मैं अपने आईफोन ऐप के लिए नेटवर्क परत के रूप में AFNetworking का उपयोग कर रहा हूं जो एक रेल सर्वर से जुड़ता है जो प्रमाणीकरण के लिए डेविस का उपयोग करता है। यदि मैं उपयोगकर्ता नाम/पासवर्ड प्रदान करते हुए (POST कॉल के साथ) साइन इन करता हूं तो उसके बाद मैं जो भी जीईटी करता हूं वह ठीक है।AFNetworking और कुकीज़

यदि मैं ऐप बंद करता हूं (केवल पृष्ठभूमि नहीं) तो मेरे सभी जीईटी अनुरोध विफल हो जाते हैं क्योंकि मुझे लगता है कि वे प्रमाणीकृत नहीं हैं।

तो मुझे लगता है कि कुकीज़ कहीं भी संग्रहीत की जाती है; NSUserDefaults में या कहीं भी लॉग इन करने से बचने के लिए उन्हें ऐसा करने का कोई तरीका है?

उत्तर

9

कुकीज वास्तव में किसी विशेष सर्वर पर किसी भी अनुरोध के लिए आपके एप्लिकेशन के जीवनकाल के लिए स्वचालित रूप से संग्रहीत होते हैं। एक अच्छी रणनीति-चेन में उपयोगकर्ता नाम और पासवर्ड या NSUserDefaults में इस तरह स्टोर करने के लिए किया जाएगा:

// Setting 
[[NSUserDefaults standardDefaults] setObject:username forKey:@"username"]; 
[[NSUserDefaults standardDefaults] synchronize]; 

// Getting 
NSString *username = [[NSUserDefaults standardDefaults] objectForKey:@"username"]; 

आप एक Authorization HTTP शीर्ष लेख में AFHTTPClient के साथ संयोजन में इस का उपयोग करने के लिए हर अनुरोध के साथ आपके क्रेडेंशियल्स भेजने के लिए चाहते हो सकता है ।

+1

धन्यवाद, हाँ यह है कि क्या मैं पुराने साख रखने के लिए करते हैं। मैं जो भी टालना चाहूंगा वह हर ऐप पर लॉगिन के लिए प्रारंभिक पोस्ट है, मैं बस सोच रहा था कि क्या AFNetworking द्वारा संचालित कुकी का जीवनकाल बढ़ाया जा सकता है। –

+26

दरअसल, कृपया NSUserDefaults में उपयोगकर्ता नाम और पासवर्ड स्टोर न करें। इसके बजाय कीचेन का प्रयोग करें। ऐप्पल एक कीचेनवापर वितरित करता है जो मूल रूप से एक ही चीज़ करता है, लेकिन अधिक सुरक्षित रूप से। – eddieroger

75

यदि आप NSURLCredential का उपयोग NSUserDefaults और न ही किसी कीचेन आवरण के साथ परेशान करने के लिए जरूरत नहीं है। वास्तव में NSURLCredential का उपयोग करने के लिए बहुत आसान है, क्योंकि यह आपको पर कोड के दो पंक्तियों में कीचेन दोनों उपयोगकर्ता नाम और पासवर्ड दोनों स्टोर करने की अनुमति देता है।

आपका कोड ऐसा ही कुछ एक बार उपयोगकर्ता के प्रवेश होगा:

NSURLCredential *credential; 

credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent]; 
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace]; 

फिर, हर बार एप्लिकेशन शुरू की है, आप जाँच कर सकते हैं अपने उपयोगकर्ता पहले से ही किसी भी क्रेडेंशियल के लिए खोज के द्वारा में लॉग इन किया गया था कि क्या आदेश स्वचालित रूप से आपके उपयोगकर्ता फिर से लॉग इन (यदि आवश्यकता हुई):

NSURLCredential *credential; 
NSDictionary *credentials; 

credentials = [[NSURLCredentialStorage sharedCredentialStorage] credentialsForProtectionSpace:self.loginProtectionSpace]; 
credential = [credentials.objectEnumerator nextObject]; 
NSLog(@"User %@ already connected with password %@", credential.user, credential.password); 

तुम भी जब उपयोगकर्ता को लॉग आउट करना चाहता है क्रेडेंशियल साफ करने के लिए की जरूरत है:

NSURLCredential *credential; 
NSDictionary *credentials; 

credentials = [[NSURLCredentialStorage sharedCredentialStorage] credentialsForProtectionSpace:self.loginProtectionSpace]; 
credential = [credentials.objectEnumerator nextObject]; 
[[NSURLCredentialStorage sharedCredentialStorage] removeCredential:credential forProtectionSpace:self.loginProtectionSpace]; 

loginProtectionSpace सभी के लिए एक बार बनाया गया है। कृपया, इस नमूना कोड को ध्यान दें कि इस स्थान में केवल एक प्रमाण पत्र है, जो आम तौर पर तब तक होता है जब तक आप कई खातों का प्रबंधन नहीं करते।

यहाँ कैसे आप एक NSURLProtectionSpace बन जाएगा का एक उदाहरण है: जवाब देना के लिए

NSURL *url = [NSURL URLWithString:@"http://www.example.com"]; 
self.loginProtectionSpace = [[NSURLProtectionSpace alloc] initWithHost:url.host 
                    port:[url.port integerValue] 
                   protocol:url.scheme 
                   realm:nil 
                authenticationMethod:NSURLAuthenticationMethodHTTPDigest]; 
+0

NSURLProtectionSpace बनाने के लिए कोड कहां है? मैंने ऐप्पल दस्तावेज़ों को देखा लेकिन यह वास्तव में मुझे स्पष्ट नहीं है कि एक कैसे बनाया जाए। मैं "self.loginProtectionSpace" का जिक्र कर रहा हूं – user798719

+0

मुझे लगता है कि मेरा क्या मतलब है, बंदरगाह और होस्टनाम मामला करें या ये नामस्थान हैं? – user798719

+4

मैंने NSURLProtectionSpace बनाने के तरीके के उदाहरण के साथ अपना उत्तर अपडेट कर दिया है। कृपया यूआरएल को अपने साथ बदलें और प्रमाणीकरण विधि पैरामीटर को अपने सर्वर द्वारा उपयोग की जाने वाली प्रमाणीकरण विधि के साथ अपडेट करें। – Phil