2013-01-10 26 views
10

यदि कोई उपयोगकर्ता मोबाइल सफारी में https वेब पेज लोड करने का प्रयास करता है और सर्वर का प्रमाणपत्र सत्यापन जांच विफल हो जाती है (इसकी अवधि समाप्त हो जाती है, निरस्त, स्वयं हस्ताक्षरित इत्यादि) तो उपयोगकर्ता प्रस्तुत किया जाता है एक चेतावनी संदेश प्रस्तुत किया जाता है और पूछा जाता है कि वे चाहते हैं या नहीं जारी रखने या नहीं।क्या किसी को UIWebView का उपयोग कर अमान्य सर्वर प्रमाणपत्र के साथ HTTPS पृष्ठों को लोड करने का कोई तरीका मिला है?

इसी तरह एनएसआरएलकनेक्शन कार्यान्वयनकर्ता को प्रमाण पत्र की जांच करने के लिए पहले निर्णय लेने की क्षमता प्रदान करता है और फिर यह तय करता है कि यह विफल होने पर कैसे आगे बढ़ना है, इसलिए इस स्थिति में भी उपयोगकर्ता को चेतावनी प्रदर्शित करना और उन्हें प्रदान करना संभव होगा पृष्ठ लोड करना जारी रखने का अवसर या नहीं।

हालांकि ऐसा लगता है कि UIWebView में एक https पृष्ठ लोड करते समय प्रमाणपत्र जांचने में विफल रहता है, व्यवहार केवल पृष्ठ को लोड करने में विफल रहता है - didFailLoadWithError: kCFURLErrorServerCertificateUntrusted के साथ कॉल किया जाता है हालांकि उपयोगकर्ता को कुछ भी प्रदर्शित नहीं होता है।

यह असंगत है - निश्चित रूप से UIWebView व्यवहार को सफारी के समान तरीके से आईफोन के भीतर संगत होने के साथ व्यवहार करना चाहिए? यह भी एक दाढ़ी है कि NSURLConnection इस अभी तक NSURLRequest के साथ कुल लचीलापन की अनुमति देता है: setAllowsAnyHTTPSCertificate निजी है।

क्या सफारी के साथ संगत व्यवहार को लागू करने के लिए वैसे भी है, क्या यह डिफ़ॉल्ट व्यवहार NSURLConnection की अनुमति के समान तरीके से अनुकूलित किया जा सकता है?

चीयर्स

पीएस कृपया पक्षपातपूर्ण साझेदारी में शामिल होने से बचें कि कोई ऐसा क्यों करना चाहेगा, आपको बहुत धन्यवाद।

उत्तर

14

मुझे पता चला है कि यह कैसे करना है:

1) जब पेज लोड होने पर होगा असफल, इस प्रकार didFailLoadWithError के लिए निम्न की तरह कुछ जोड़ें:

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 
    if ([error.domain isEqualToString: NSURLErrorDomain]) 
    { 
     if (error.code == kCFURLErrorServerCertificateHasBadDate  || 
      error.code == kCFURLErrorServerCertificateUntrusted   || 
      error.code == kCFURLErrorServerCertificateHasUnknownRoot || 
      error.code == kCFURLErrorServerCertificateNotYetValid) 
     { 
     display dialog to user telling them what happened and if they want to proceed 

2) उपयोगकर्ता तो पेज लोड करने के लिए चाहता है आप एक NSURLConnection का उपयोग कर कनेक्ट करने की आवश्यकता:

NSURLRequest *requestObj = [NSURLRequest requestWithURL:self.currentURL  cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0]; 
self.loadingUnvalidatedHTTPSPage = YES; 
[self.webView loadRequest:requestObj]; 

3) फिर shouldStartLoadWithRequest में यह परिवर्तन करने

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    if (self.loadingUnvalidatedHTTPSPage) 
    { 
     self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
     [self.connection start]; 
     return NO; 
    } 

4) के रूप में NSURLConnectionDelegate लागू:

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    SecTrustRef trust = challenge.protectionSpace.serverTrust; 
    NSURLCredential *cred; 
    cred = [NSURLCredential credentialForTrust:trust]; 
    [challenge.sender useCredential:cred forAuthenticationChallenge:challenge]; 
} 


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; 
{ 
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:self.currentURL cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0]; 
    self.loadingUnvalidatedHTTPSPage = NO; 
    [self.webView loadRequest: requestObj]; 
    [self.connection cancel]; 
} 

यह सब ठीक काम करता प्रतीत होता है।

+0

मेरी समस्या तय की गई। धन्यवाद! –

1

घोड़े के मुंह से:।।

"UIWebView अपनी HTTPS सर्वर विश्वास मूल्यांकन अनुकूलित करने के लिए किसी एप्लिकेशन के लिए किसी भी तरह से प्रदान नहीं करता है यह सार्वजनिक API का उपयोग करके इस सीमा के आसपास काम करने के लिए संभव है, लेकिन यह आसान नहीं है, तो यदि आप ऐसा करने की जरूरत है, डेवलपर तकनीकी सहायता ([email protected]) से संपर्क करें

स्रोत: http://developer.apple.com/library/ios/#technotes/tn2232/_index.html

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^