2009-06-14 13 views
13

पर मूल HTTP प्रमाणीकरण मैं एक छोटा ट्विटर क्लाइंट चलाने की कोशिश कर रहा हूं और मैं एपीआई कॉल की जांच करते समय एक समस्या में भाग गया जिसके लिए प्रमाणीकरण की आवश्यकता है।आईफोन

मेरे पासवर्ड में इसमें विशेष वर्ण हैं, इसलिए जब मैं निम्न कोड का उपयोग करने का प्रयास करता हूं तो यह काम नहीं करता है।

NSString *post = [NSString stringWithFormat:@"status=%@", [status stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; 

NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@:%@@%@/statuses/update.json", username, password, TwitterHostname]]; 
[request setURL:url]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:postData]; 

NSURLResponse *response; 
NSError *error; 
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

मैंने बेस 64 में देखना शुरू कर दिया और प्रमाणीकरण को हेडर में डाल दिया। मैंने अपने बेस 64 कार्यान्वयन पर Dave Dribin's पोस्ट पाया, और यह समझ में आया। हालांकि जब मैंने इसका उपयोग करने की कोशिश की तो संकलक ने शिकायत शुरू कर दी कि यह कैसे openssl पुस्तकालयों को नहीं मिला। तो मैंने पढ़ा कि मुझे libcrypto लाइब्रेरी में लिंक करने की आवश्यकता है, लेकिन यह आईफोन के लिए मौजूद नहीं प्रतीत होता है।

मैंने लोगों को यह भी पढ़ा है कि सेब उन ऐप्स को अनुमति नहीं देगा जो क्रिप्टो पुस्तकालयों का उपयोग करते हैं, जो मुझे समझ में नहीं आता है।

तो अब मैं थोड़ी फंसे और उलझन में हूं। मेरे ऐप में बुनियादी प्रमाणीकरण प्राप्त करने का सबसे आसान तरीका क्या है?

चीयर्स

उत्तर

15

दो चीजें। सबसे पहले आपको सिंक्रोनस/क्लास विधि के बजाय एसिंक विधियों का उपयोग करना होगा।

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:req] 
                   cachePolicy:NSURLRequestUseProtocolCachePolicy 
                  timeoutInterval:30.0]; 

// create the connection with the request 
// and start loading the data 
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

प्रमाणीकरण आपका प्रतिनिधि में इस विधि को लागू करने से प्रबंधित किया जाता है

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge; 

और आप शायद भी इन तरीकों को लागू करने की आवश्यकता होगी: async पद्धति का उपयोग करना

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection; 

वैसे भी एक बेहतर उपयोगकर्ता अनुभव देने के लिए जाता है, इसलिए अतिरिक्त जटिलता प्रमाणीकरण करने की क्षमता के बिना भी करने योग्य है।

+0

मैं initWithRequest को sendSynchronous कॉल बदल दिया है: अनुरोध प्रतिनिधि: स्वयं और फिर प्रतिनिधियों में didReceiveAuthenticationChallenge सेटअप, लेकिन कुछ भी नहीं कहा जाता है। मैंने अन्य NSURLConnection प्रतिनिधि विधियों की कोशिश की और वे या तो काम नहीं किया। कोई विचार? – Meroon

+0

मुझे पता चला कि प्रतिनिधि विधियां क्यों काम नहीं कर रही थीं। मैं एक कक्षा विधि से initWithRequest बुला रहा था जो काम नहीं करेगा। सहायता के लिए धन्यवाद। – Meroon

+0

क्षमा करें, अनावश्यक रूप से जवाब दें (लेकिन खुश है कि आप अंत में वहां पहुंचे)।मैंने इसे विस्तारित किया है। उम्मीद है कि यह अब थोड़ा और उपयोगी है। –

0

आप सीधे भी है यानी https://username:[email protected]/

तुम सब NSURLConnection प्रतिनिधि फ़ाइल कॉल करने की आवश्यकता सबसे पहले मुख्य यूआरएल में उपयोगकर्ता नाम & पासवर्ड डाउनलोड लिख सकते हैं: -

  • (BOOL) कनेक्शन: (NSURLConnection *) कनेक्शन canAuthenticateAgainstProtectionSpace: (NSURLProtectionSpace *) protectionSpace

    {

    वापस यस; }

और फिर फोन - (शून्य) कनेक्शन: (NSURLConnection *) कनेक्शन didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *) चुनौती

{ 
if ([challenge previousFailureCount] == 0) 
     { 
      NSURLCredential *newCredential; 

      newCredential = [NSURLCredential credentialWithUser:@"username" 
                 password:@"password" 
                persistence:NSURLCredentialPersistenceForSession]; 
      NSLog(@"NEwCred:- %@ %@", newCredential, newCredential); 
      [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge]; 
     } 
     else 
     { 
      [[challenge sender] cancelAuthenticationChallenge:challenge]; 
      NSLog (@"failed authentication"); 
     } 
}