在Xamarin.Forms中调用JavaScript函数IOS WebViewRenderer

时间:2015-08-04 02:29:52

标签: javascript c# ios xamarin xamarin.forms

我正在使用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函数的任何想法吗?

1 个答案:

答案 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方法。您使用哪种本机浏览器控件?你能透露完整的渲染器代码吗?