如何在跨平台的移动应用程序项目(VS 2017 / Xamarin)中实现WkWebView?

时间:2018-07-21 00:11:06

标签: xamarin.forms xamarin.ios

我有一个实现通用WebView控件的跨平台移动应用(Android / iOS)。在大多数情况下,此方法效果很好,但是某些iOS用户抱怨,当尝试加载某些资源密集的网页时,该应用程序“变黑”,然后焦点返回到主菜单视图。我的怀疑是该应用程序由于网页的内容量和处理开销而令人窒息,但是坦率地说,这是一个盲目的猜测,我没有足够的资源(例如可以使用的iPhone)来进行验证这个。在Mac上使用iPhone模拟器不会重现“黑屏”问题。

因此,我正在尝试为8.0及更高版本的iOS设备并行实现WkWebView,因为这可能会提高性能,并且可能可以缓解此问题。它只是在工作,但是在ViewController和ContentPage之间似乎存在脱节,该地方应该承载了我无法纠正的WkWebView控件。

下面是常规实现:

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class WkWebViewPage : ContentPage
{
    public WkWebViewPage (string url, string title)
    {
        InitializeComponent();

        Title = title;

        App.GetWkWebView(this, url);
    }
}

WkWebPageView的标记没有内部内容。

App.GetWkWebView方法是Action类型的委托,该委托在主要App类中作为静态属性实现。这在AppDelegate类(iOS项目)的FinishedLaunching方法中分配给了我用来管理调用WkWebView的静态类中的静态方法。此类的实现如下:

public static class WkWebViewController
{
    private static WKWebView _wkWebView;

    public static void GetWkWebView(Page parentView, string url)
    {
        if(_wkWebView == null)
        {

    // INSERT ATTEMPTED APPROACHES BELOW HERE

            var frame = view.Frame;

            var cgRect = new CoreGraphics.CGRect(frame.X, frame.Y, frame.Width, frame.Height);

            _wkWebView = new WKWebView(cgRect, new WKWebViewConfiguration());

            view.AddSubview(_wkWebView);

    // NavigationDelegate is a custom class; not germane to the issue
            _wkWebView.NavigationDelegate = new NavigationDelegate();
        }

        var nsUrl = new NSUrl(url);
        var request = new NSUrlRequest(nsUrl);

        _wkWebView.LoadRequest(request);
    }
}

这是麻烦开始的地方。我尝试了两种方法来获取适当的ViewController,更相关的是UIView对象:

1)

var renderer = Platform.GetRenderer(parentView);

if (renderer == null)
{
    renderer = Platform.CreateRenderer(parentView);
    Platform.SetRenderer(parentView, renderer);
}

var view = renderer.ViewController.View;

结果如下:

App Screenshot 1

内容区域为白色/空白。收到200响应后,http请求已成功提交。请注意,内容区域上方的导航栏会正确显示。

2)

var window = UIApplication.SharedApplication.KeyWindow;

var vc = window.RootViewController;

while (vc.PresentedViewController != null)
{
    vc = vc.PresentedViewController;
}

var view = vc.View;

这将导致:

App Screenshot 2

在这种情况下,将显示网页;但是,WkWebView控件占据了整个屏幕,遮挡了导航栏(似乎是状态栏)。

任何建议将不胜感激!

0 个答案:

没有答案