2014-09-17 2 views
6
zu öffnen

Wie der Titel der Frage beschrieben, möchte ich eine selbstsignierte Webseite in einem UIWebview öffnen (Xamarin.iOS) Standardmäßig werden selbst signierte Webseiten nicht in einem UIWebView geladen.Xamarin Weg, selbstsignierte Zertifikatwebseite in UIWebView

Wichtige Anforderungen an die Lösung:

  • Es sollte von Apple akzeptiert werden, wenn ich die App auf dem Apple App Store (so eine benutzerdefinierte NSURLRequest nicht passt) einreichen möchten.
  • Es sollte CSS und JavaScript ordnungsgemäß laden.

Ich fand eine mögliche Lösung auf Stackoverflow, aber das ist für natives iOS. https://stackoverflow.com/a/11664147 Ich fragte mich auch, ob die oben beschriebene Lösung erfordert, sich mit einem NSUrlConnectionDelegate einzuloggen.

Die gewünschte Lösung sollte sein, dass der Benutzer die Anmeldeinformationen selbst ausfüllen kann, indem er UIWebView verwendet.

Kann jemand die Xamarin-Lösung dafür bereitstellen? Ich habe es selbst ausprobiert, konnte es aber nicht schaffen.

Vielen Dank im Voraus für Ihre Hilfe.

Antwort

2

Ich weiß, das ist eine ziemlich alte Post, aber es war eine ziemlich interessante Frage, also musste ich bei at gehen. Also, wenn Sie es immer noch brauchen (höchstwahrscheinlich nicht) oder wenn jemand diesen Beitrag findet, hier sind eine portierte Version des nativen UIWebView mit Unterstützung für selbstsigniert. Es kann als reguläres UIWebView verwendet werden, mit der Ausnahme, dass es einen Hostnamen als zusätzlichen Parameter verwendet, der der Hostname der Seite sein sollte, auf der die Zertifikatsüberprüfung deaktiviert werden sollte.

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); 
    } 
}