2014-09-17 5 views
6

में स्वयं हस्ताक्षरित प्रमाणपत्र वेबपृष्ठ खोलने के लिए Xamarin तरीका प्रश्न शीर्षक के रूप में वर्णित है, मैं UIWebview (Xamarin.iOS) के भीतर एक स्वयं हस्ताक्षरित वेबपृष्ठ खोलना चाहता हूं डिफ़ॉल्ट रूप से, स्वयं हस्ताक्षरित वेबपृष्ठ UIWebView में लोड नहीं होते हैं।UIWebView

समाधान के लिए महत्वपूर्ण आवश्यकताओं:

  • यह एप्पल द्वारा स्वीकार किया जाना चाहिए जब मैं एप्पल app की दुकान (ताकि एक कस्टम NSURLRequest फिट नहीं करता है) करने के लिए एप्लिकेशन प्रस्तुत करना चाहते हैं।
  • इसे सीएसएस और जावास्क्रिप्ट को ठीक से लोड करना चाहिए।

मुझे स्टैक ओवरफ्लो पर एक संभावित समाधान मिला लेकिन यह मूल आईओएस के लिए है। https://stackoverflow.com/a/11664147 मैं यह भी सोच रहा था कि ऊपर वर्णित समाधान को NSUrlConnectionDelegate का उपयोग करके लॉगिन करना आवश्यक है।

वांछित समाधान यह होना चाहिए कि उपयोगकर्ता UIWebView का उपयोग करके स्वयं प्रमाण-पत्र भर सकता है।

क्या कोई इस के लिए ज़ैमरिन समाधान प्रदान कर सकता है? मैंने इसे अपने आप से कोशिश की लेकिन इसे काम नहीं मिला।

आपकी मदद के लिए अग्रिम धन्यवाद।

उत्तर

2

मुझे पता है कि यह काफी पुरानी पोस्ट है, लेकिन यह एक दिलचस्प सवाल था, इसलिए मुझे वहां जाना पड़ा। इसलिए यदि आपको अभी भी इसकी आवश्यकता है (अधिकतर संभावना नहीं है) या यदि कोई इस पोस्ट को पाता है, तो यहां स्वयं हस्ताक्षर के लिए मूल UIWebView का एक पोर्ट संस्करण है। इसे अपवाद के साथ नियमित UIWebView के रूप में उपयोग किया जा सकता है कि यह अतिरिक्त पैरामीटर के रूप में होस्टनाम लेता है, जो उस पृष्ठ का होस्टनाम होना चाहिए जहां प्रमाणपत्र जांच अक्षम की जानी चाहिए।

public class InsecureWebView : UIWebView, INSUrlConnectionDataDelegate, IUIWebViewDelegate 
{ 
    public InsecureWebView(string baseUrl) : base() 
    { 
     Setup (baseUrl); 
    } 

    public InsecureWebView(CoreGraphics.CGRect rect, string baseUrl) : base(rect) 
    { 
     Setup (baseUrl); 
    } 

    public InsecureWebView(NSCoder coder, string baseUrl) : base(coder) 
    { 
     Setup (baseUrl); 
    } 

    public InsecureWebView(NSObjectFlag t, string baseUrl) : base(t) 
    { 
     Setup (baseUrl); 
    } 

    public InsecureWebView(IntPtr handler, string baseUrl) : base(handler) 
    { 
     Setup (baseUrl); 
    } 

    string baseUrl = null; 
    bool authenticated; 
    NSUrlRequest failedRequest; 

    private void Setup(string baseUrl) 
    { 
     this.Delegate = this; 
     this.baseUrl = baseUrl; 
    } 


    [Foundation.Export ("webView:shouldStartLoadWithRequest:navigationType:")] 
    public bool ShouldStartLoad (UIKit.UIWebView webView, Foundation.NSUrlRequest request, UIKit.UIWebViewNavigationType navigationType) 
    { 
     var result = authenticated; 
     if (!authenticated) { 
      failedRequest = request; 
      NSUrlConnection.FromRequest (request, this); 
     } 
     return result; 
    } 

    [Foundation.Export ("connection:willSendRequestForAuthenticationChallenge:")] 
    public void WillSendRequestForAuthenticationChallenge (NSUrlConnection connection, NSUrlAuthenticationChallenge challenge) 
    { 
     if (challenge.ProtectionSpace.AuthenticationMethod == NSUrlProtectionSpace.AuthenticationMethodServerTrust) { 
      var baseUrl = new NSUrl (this.baseUrl); 
      if (challenge.ProtectionSpace.Host == baseUrl.Host) { 
       challenge.Sender.UseCredential (NSUrlCredential.FromTrust (challenge.ProtectionSpace.ServerSecTrust), challenge); 
      } 
     } 
     challenge.Sender.ContinueWithoutCredential (challenge); 
    } 

    [Foundation.Export ("connection:didReceiveResponse:")] 
    public void DidReceivedResponse(NSUrlConnection connection, NSUrlResponse response) 
    { 
     authenticated = true; 
     connection.Cancel(); 
     LoadRequest (failedRequest); 
    } 
}