首页 > 解决方案 > Xamarin.iOS WKWebView 和 WKNavigationDelegate 自定义渲染器 Intranet SharePoint 链接不起作用

问题描述

我正在开发一个 Xamarin 表单应用程序,并且我创建了自定义渲染器以使用本机 Web 视图。

我们在 Web 视图内容中有一些 Intranet SharePoint URL 链接,这些链接在 iPhone 真实设备中不起作用。公共 URL 链接工作正常,但 Intranet SharePoint URL 链接在单击链接后无法正常工作,Web 视图内容会自动隐藏,并且该链接也未在 Safari 浏览器中打开。

奇怪的是它在模拟器中运行良好。公共 URL 链接也可以正常工作。

以下是我们的 Intranet SharePoint URL,它不能在真实设备中运行,也不能在模拟器中运行。

https://test.demosharepointsite.com/informatik/_layouts/15/WopiFrame.aspx?sourcedoc=%7b25F01E60-0EEC-4A6B-BD26-81B2ED1911CA%7d&file=AA_TenantMigration_2in1_Device_O365.pdf&action=default

预期行为:

单击链接时,应在 Safari 浏览器中打开 URL 链接。

以下是 iOS 原生自定义渲染器的代码片段。


public class ExtendedWebViewRenderer : WkWebViewRenderer
{
    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        try
        {
            base.OnElementChanged(e);
            NavigationDelegate = new AppWKNavigationDelegate(this);
        }
        catch (Exception ex)
        {
            
        }
    }
}

public class AppWKNavigationDelegate : WKNavigationDelegate
{
    ExtendedWebViewRenderer extendedWebViewRenderer;
    public AppWKNavigationDelegate(ExtendedWebViewRenderer _extendedWebViewRenderer)
    {
        
        extendedWebViewRenderer = _extendedWebViewRenderer ?? new ExtendedWebViewRenderer();
    }

    public override async void DidFinishNavigation(WKWebView webView, WKNavigation navigation)
    {
        try
        {
            var extendedWebViewModel = extendedWebViewRenderer.Element as ExtendedWebViewModel;
            if (extendedWebViewModel != null)
            {
                if (webView != null)
                {
                    await System.Threading.Tasks.Task.Delay(100); // wait here till content is rendered
                    if (webView.ScrollView != null)
                    {
                        if (webView.ScrollView.ContentSize != null)
                        {
                            extendedWebViewModel.HeightRequest = (double)webView.ScrollView.ContentSize.Height;
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            
        }
    }

    public override void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action<WKNavigationActionPolicy> decisionHandler)
    {
        try
        {
            if (navigationAction != null)
            {
                if (navigationAction.NavigationType == WKNavigationType.LinkActivated)
                {
                    if (navigationAction.Request != null)
                    {
                        if (navigationAction.Request.Url != null)
                        {
                            UIApplication.SharedApplication.OpenUrl(navigationAction.Request.Url);
                            decisionHandler(WKNavigationActionPolicy.Cancel);
                        }
                    }
                }
                else
                {
                    decisionHandler(WKNavigationActionPolicy.Allow);
                }
            }
        }
        catch (Exception ex)
        {
            
        }
    }
}


有谁可以帮我离开这里吗?谢谢。

标签: xamarin.formsxamarin.ioswkwebviewcustom-rendererwknavigationdelegate

解决方案


推荐阅读