在webview中启用基本身份验证,而无需在Xamarin表单中自定义WebViewClient &



我在我的Xamarin Forms项目与Hybrid Rendererwebview中使用webview,因为我必须在页面内注入javascript代码。

在我的主要项目,我有一个CustomWebview.cs:

namespace ClotureSiadForms.Renderer
{
public class CustomWebView : WebView
{
public string js = "";
public CustomWebView()
{
Navigating+= WebViewNavigating;
Navigated+=WebViewNavigated;
}
private void WebViewNavigated(object sender, WebNavigatedEventArgs args)
{
EvaluateJavaScriptAsync(js);
}
public void WebViewNavigating(object sender, WebNavigatingEventArgs args)
{
if (args.Url.StartsWith("tel:"))
{
var tel = args.Url.Split(':')[1];
args.Cancel = true;
Xamarin.Essentials.PhoneDialer.Open(tel);
}
else if (!args.Url.StartsWith("http") || args.Url.EndsWith(".apk") || args.Url.EndsWith(".pdf") || args.Url.EndsWith(".zip"))
{
args.Cancel = true;
Xamarin.Essentials.Launcher.OpenAsync(args.Url);
}
}
}
}

在我的Android项目我有一个HybridWebViewRenderer.cs:

[assembly: ExportRenderer(typeof(CustomWebView), typeof(HybridWebViewRenderer))]
namespace ClotureSiadForms.Droid.Renderer
{
internal class HybridWebViewRenderer : WebViewRenderer
{
public HybridWebViewRenderer(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
{
base.OnElementChanged(e);
if (Control != null)
{
CustomWebView webview = e.NewElement as CustomWebView;
Control.Settings.JavaScriptEnabled = true;
Control.Settings.DomStorageEnabled = true;
Control.Settings.SavePassword = true;
}
}
}
}

就这样,它工作了并且能够下载文件但由于我需要基本的身份验证,我在HybridWebViewRenderer.cs中添加了一个自定义webviewclient:

protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
{
base.OnElementChanged(e);
if (Control != null)
{
CustomWebView webview = e.NewElement as CustomWebView;
Control.Settings.JavaScriptEnabled = true;
Control.Settings.DomStorageEnabled = true;
Control.Settings.SavePassword = true;
var login = Preferences.Get("login", "");
var password = Preferences.Get("password", "");
Control.SetWebViewClient(new AuthWebViewClient(login, password));
}
}
public class AuthWebViewClient : WebViewClient
{
private string Username;
private string Password;
public AuthWebViewClient(string username, string password)
{
Username = username;
Password = password;
}
public override void OnReceivedHttpAuthRequest(Android.Webkit.WebView view, HttpAuthHandler handler, string host, string realm)
{
handler.Proceed( Username,Password);
}
}

认证工作,但WebViewNavigating现在被调用一次,然后自定义客户端被设置,然后WebViewNavigating永远不会被调用。

然后我的问题是,我不能使用基本认证没有自定义客户端,或者有一种方法来保持使用我的customwebview与客户端?

身份验证工作,但WebViewNavigating现在被调用一次,然后自定义客户端被设置,然后WebViewNavigating永远不会被调用。

我测试了您提供的代码,并在WebViewNavigating方法中添加了断点。即使你不添加webviewclient,它也只会调用WebViewNavigating一次。

您可以将WebViewNavigating中的代码放入ShouldInterceptRequest:

public class AuthWebViewClient : WebViewClient
{
...
public override WebResourceResponse ShouldInterceptRequest(Android.Webkit.WebView view, IWebResourceRequest request)
{
var url = request.Url;
...
}
}

当WebView开始加载一个新页面时,它将调用ShouldInterceptRequest.

相关内容

  • 没有找到相关文章