首页 文章

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

提问于
浏览
0

我正在使用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 回答

相关问题