2014-09-17 13 views
6

Come descritto nella domanda, desidero aprire una pagina Web autofirmata in un UIWebview (Xamarin.iOS) Per impostazione predefinita, le pagine Web autofirmate non vengono caricate in un UIWebView.Xamarin per aprire la pagina Web del certificato autofirmato in UIWebView

requisiti importanti per la soluzione:

  • Dovrebbe essere accettato da Apple quando voglio inviare l'applicazione per l'App Store di Apple (quindi un NSUrlRequest personalizzato non si adatta).
  • Dovrebbe caricare correttamente css e javascript.

Ho trovato una soluzione su stackoverflow ma questa è per iOS nativo. https://stackoverflow.com/a/11664147 Mi chiedevo anche se la soluzione sopra descritta richiede l'accesso utilizzando NSUrlConnectionDelegate.

La soluzione desiderata dovrebbe essere che l'utente possa compilare le credenziali da solo utilizzando UIWebView.

Qualcuno potrebbe fornire la soluzione Xamarin per questo? L'ho provato da solo ma non riuscivo a farlo funzionare.

Grazie in anticipo per il vostro aiuto.

risposta

2

So che questo è piuttosto un vecchio post, ma era una domanda piuttosto interessante, quindi ho dovuto provare a. Quindi se ne hai ancora bisogno (molto probabilmente no) o se qualcuno trova questo post, ecco una versione con porting della UIWebView nativa con supporto per autofirmato. Può essere usato come un normale UIWebView con l'eccezione che richiede un nome host come parametro aggiuntivo, che dovrebbe essere il nome host della pagina in cui il controllo del certificato deve essere disabilitato.

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