Xamarin.forms Xamarin.iOS WKWebView和WKNavigationDelegate自定义呈现程序内部网SharePoint链接不工作

Xamarin.forms Xamarin.iOS WKWebView和WKNavigationDelegate自定义呈现程序内部网SharePoint链接不工作,xamarin.forms,xamarin.ios,wkwebview,custom-renderer,wknavigationdelegate,Xamarin.forms,Xamarin.ios,Wkwebview,Custom Renderer,Wknavigationdelegate,我正在开发一个Xamarin forms应用程序,并创建了自定义渲染器以使用本机web视图 我们在web视图内容中有一些内部网SharePoint URL链接,这些链接在iPhone real设备中不起作用。公共URL链接工作正常,但单击链接后,intranet SharePoint URL链接不工作web视图内容自动隐藏,并且该链接也不会在Safari浏览器中打开 奇怪的是,它在模拟器中运行良好。公共URL链接也可以正常工作 下面是我们的内部网SharePoint URL,它在真实设备中不起作

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

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

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

下面是我们的内部网SharePoint URL,它在真实设备中不起作用,在模拟器中也不起作用

https://test.demosharepointsite.com/informatik/_layouts/15/WopiFrame.aspx?sourcedoc=%7b25F01E60-0EEC-4A6B-BD26-81B2ED1911CA%7d&file=AA\u租户迁移\u 2in1\u设备\u 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)
        {
            
        }
    }
}



公共类扩展WebViewRenderer:WkWebViewRenderer
{
受保护的覆盖无效OnElementChanged(VisualElementChangedEventArgs e)
{
尝试
{
基础。一个要素发生变化(e);
NavigationDelegate=新的AppWKNavigationDelegate(此);
}
捕获(例外情况除外)
{
}
}
}
公共类AppWKNavigationDelegate:WKNavigationDelegate
{
ExtendedWebViewRenderer ExtendedWebViewRenderer;
公共AppWKNavigationDelegate(ExtendedWebViewRenderer\u ExtendedWebViewRenderer)
{
extendedWebViewRenderer=_extendedWebViewRenderer??新建extendedWebViewRenderer();
}
公共覆盖异步void DidFinishNavigation(WKWebView、WKNavigation)
{
尝试
{
var extendedWebViewModel=extendedWebViewRenderer.Element作为extendedWebViewModel;
if(extendedWebViewModel!=null)
{
if(webView!=null)
{
wait System.Threading.Tasks.Task.Delay(100);//在此处等待,直到呈现内容
if(webView.ScrollView!=null)
{
if(webView.ScrollView.ContentSize!=null)
{
extendedWebViewModel.HeightRequest=(双精度)webView.ScrollView.ContentSize.Height;
}
}
}
}
}
捕获(例外情况除外)
{
}
}
公共覆盖无效决策策略(WKWebView webView、WKNavigationAction navigationAction、Action decisionHandler)
{
尝试
{
if(navigationAction!=null)
{
如果(navigationAction.NavigationType==WKNavigationType.LinkActivated)
{
if(navigationAction.Request!=null)
{
if(navigationAction.Request.Url!=null)
{
UIApplication.SharedApplication.OpenUrl(navigationAction.Request.Url);
decisionHandler(WKNavigationActionPolicy.Cancel);
}
}
}
其他的
{
decisionHandler(WKNavigationActionPolicy.Allow);
}
}
}
捕获(例外情况除外)
{
}
}
}

有人能帮我吗?谢谢。

您好,同一网段内的物理设备是否与模拟器设备在一起?模拟器设备的网段应与Mac相同,但不确定物理设备是否保持相同,是否可以访问此intranet。您可以先检查物理设备的safari是否可以打开一个测试内联网。@JuniorJiang MSFT否物理设备和模拟器都不在同一网段中。两者都在不同的网段中。但至少该链接应该在Safari浏览器中打开,并且web视图内容不应该自动隐藏。对吗?如果链接可以在物理设备的Safari浏览器中打开,那么它应该可以在应用程序中工作。至少在本地网络环境中,您应该将它们保持在同一网段网络中。这不是问题,如果链接未在Safari浏览器中打开且无法连接到服务器,则可以。主要问题是点击链接后不应隐藏web视图内容。嗨,请问物理设备是否与模拟器设备位于同一网段内?模拟器设备的网段应与Mac相同,但不确定物理设备是否保持相同,是否可以访问此intranet。您可以先检查物理设备的safari是否可以打开一个测试内联网。@JuniorJiang MSFT否物理设备和模拟器都不在同一网段中。两者都在不同的网段中。但至少该链接应该在Safari浏览器中打开,并且web视图内容不应该自动隐藏。对吗?如果链接可以在物理设备的Safari浏览器中打开,那么它应该可以在应用程序中工作。至少在本地网络环境中,您应该将它们保持在同一网段网络中。这不是问题,如果链接未在Safari浏览器中打开且无法连接到服务器,则可以。主要的问题是它不应该在点击链接后隐藏web视图内容。