我有一个实现通用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;
结果如下:
内容区域为白色/空白。收到200响应后,http请求已成功提交。请注意,内容区域上方的导航栏会正确显示。
2)
var window = UIApplication.SharedApplication.KeyWindow;
var vc = window.RootViewController;
while (vc.PresentedViewController != null)
{
vc = vc.PresentedViewController;
}
var view = vc.View;
这将导致:
在这种情况下,将显示网页;但是,WkWebView控件占据了整个屏幕,遮挡了导航栏(似乎是状态栏)。
任何建议将不胜感激!