Как передать строку запроса в исходный код Xamarin WebView при навигации - PullRequest
1 голос
/ 21 июня 2020

Мне нужно передать строку запроса в источник WebView Xamarin при навигации (www.websiteexmple.com?mobileapp=true).

В Android работает отлично, но в IOS не кажется иногда работать правильно. Мне что-то не хватает?

Я заметил, что это не работает в IOS, когда Net Основной веб-сайт должен выполнить некоторые перенаправления: Пример: Пользователь введите адрес электронной почты и нажмите «Далее».

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

1 Ответ

0 голосов
/ 03 сентября 2020

Я думаю, что есть ошибка в WebView.Source для iOS, знак вопроса закодирован, и система не распознала 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"/>
  ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...