我正在使用Xamarin.Forms构建一个跨平台的IOS Android和Windows手机应用程序。我的一个观点是一个Web视图,它调用一个指向其中包含javascript函数的页面的url。我需要在移动应用程序中调用此函数,并将其传递给字符串值。
到目前为止一切都很好,我通过使用带有自定义视图的WebViewRenderer
在WindowsPhone中实现了这一点。在渲染器的OnElementPropertyChanged
处理程序中,我可以访问我的视图和我需要的属性,如下所示:
protected override async void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if(e.PropertyName == SessionWebView.SessionIdProperty.PropertyName)
{
view = Element as SessionWebView;
Control.LoadCompleted += Control_LoadCompleted;
if (view != null)
{
_currentSessionId = view.SessionId;
}
}
}
上面我附加了Control的load complete处理程序,它是实际的BrowserControl。然后在下面我可以在网页中调用所需的JavaScript函数。
void Control_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
if (!scriptCalled)
{
Control.IsScriptEnabled = true;
var param = new string[1];
param[0] = _currentSessionId;
Control.InvokeScript("initWebView", param);
scriptCalled = true;
}
}
这一切都在Windows Phone中完美运行。在IOS中 - 这就是这个问题的关键 - 我用自定义渲染类似的东西,我可以得到我的视图及其属性。
但是 - 我无法在IOS中获得Native浏览器控件以便能够在其上调用JavaScript函数。这就是我到目前为止所做的:
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
base.OnElementChanged(e);
if (_view == null && e.NewElement is SessionWebView)
{
_view = (SessionWebView) e.NewElement;
// Attach to the PropertyChanged event on the view
_view.PropertyChanged += _view_PropertyChanged;
}
}
private void _view_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
// Look for the sessionId propery
if (e.PropertyName == SessionWebView.SessionIdProperty.PropertyName)
{
if(_view != null && !string.IsNullOrEmpty(_view.SessionId))
{
// if we have a view set the sessionId
_currentSessionId = _view.SessionId;
// Now need Browser to attach to loaded or navaigated events...
}
}
}
有关如何访问Browser控件以调用JavaScript函数的任何想法吗?
答案 0 :(得分:1)
你有没看过XLabs HybridWebView? https://github.com/XLabs/Xamarin-Forms-Labs/blob/master/src/Forms/XLabs.Forms.iOS/Controls/HybridWebView/HybridWebViewRenderer.cs 它基于UIWebView控件并使用UIWebView.EvaluateJavascript方法。您使用哪种本机浏览器控件?你能透露完整的渲染器代码吗?