【问题标题】:How To Pass a Query String in Xamarin WebView Source On Navigating如何在导航时在 Xamarin WebView 源中传递查询字符串
【发布时间】:2020-06-21 10:08:51
【问题描述】:

我需要在导航时将查询字符串传递到 WebView Xamarin 源 (www.websiteexmple.com?mobileapp=true)。

在 Android 中运行完美,但在 IOS 中似乎有时无法正常运行。我错过了什么?

我注意到当 Net Core 网站需要进行一些重定向时,它在 IOS 中不起作用:例如:用户输入电子邮件并单击下一步。

 public void WebView_NavigatingAsync(object sender, WebNavigatingEventArgs args)
    {
        if (!args.Url.Contains(Source) && !args.Url.Contains("facebook") && !args.Url.Contains("google"))
        {
            var uri = new Uri(args.Url);
            // Device.OpenUri(uri);
            Launcher.OpenAsync(uri);
            args.Cancel = true;
        }
        else
        {
            var src = args.Url;
            string prefix = "?";
            if (src.Contains("?"))
            {
                prefix = "&";
            }
            if (!args.Url.Contains("mobileapp=true"))
            {
                args.Cancel = true;
                var webview = (WebView)sender;
                webview.Source = src + prefix + "mobileapp=true";                   
            }
        }
    }

【问题讨论】:

  • 您好,您的意思是args.Url.Contains 不起作用?
  • 您好,此代码将查询字符串添加到 URL 的末尾。示例: www.netcorewebsite.com?mobileapp=true 它在 Android 中完美运行。但是当 .Net Core 网站需要进行重定向时,它在 IOS 中不起作用。前用户输入电子邮件并单击下一步。

标签: xamarin webview


【解决方案1】:

我认为 iOS 的 WebView.Source 中存在错误,问号正在编码并且系统无法识别 URL。 您可以创建自定义 WebViewRender 并将 %3F 替换为 ?

在 iOS 项目上创建一个 CustomWebViewRender

[assembly: ExportRenderer(typeof(CustomWebView), typeof(CustomWebViewRenderer))]

namespace Test.iOS.Renders
{
    public class CustomWebViewRenderer : WkWebViewRenderer
    {

        public override WKNavigation LoadRequest (NSUrlRequest request)
        {
            var url = request.Url.ToString().Replace("html%3F", "html?");
            var dotnetURI = new System.Uri(url);

            var idn = new System.Globalization.IdnMapping();
            NSUrl nsURL = new NSUrl(dotnetURI.Scheme, idn.GetAscii(dotnetURI.DnsSafeHost), dotnetURI.PathAndQuery);
               
            return base.LoadRequest(new NSUrlRequest(nsURL));
        }
    }
}

在 Xamarin 项目中使用您的自定义 WebView

cs 文件:

namespace Test.Renders
{
    public class CustomWebView : WebView
    {
    }
}

Xaml 文件:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:test="clr-namespace:Test.Renders"
         ...>
<ContentPage.Content>
    <StackLayout>
        <test:CustomWebView x:Name="map"
                           HorizontalOptions="FillAndExpand"
                           VerticalOptions="FillAndExpand"/>
  ...

【讨论】:

    猜你喜欢
    • 2012-07-03
    • 2020-11-29
    • 2013-02-21
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    相关资源
    最近更新 更多