我正在尝试使用从App到Android WebView的函数注入javascript命名空间
注意:除了以下脚本之外,我对WebView上加载的实际源没有任何控制权。我在Xamarin工作,所以Android代码是C#
因此我使用了两个主要组件:
(function() {
console.log("Loading JS Bindings");
function addOnClickHandler () {
$(document).ready(function () {
if (window.InjectedNamespace) { // check InjectedNamespace namespace exists
var onClickHandler = window.InjectedNamespace.handleOnClick;
if (typeof onClickHandler === 'function') {
$(":button, a").each(function (idx) {
$(this).click(function() {
onClickHandler("click!");
});
});
} else {
console.error('missing onclick handler');
}
} else {
console.error('missing InjectedNamespace namespace');
}
});
}
})();
以上脚本将由第三方添加,将click
功能附加到所有<button>
和<a>
标记。
下面的命名空间将从App端注入
var InjectedNamespace={handleOnClick:function(a){Internal.handleOnClickEvent(a)}};
在App方面,我有这个Javascript界面对象
class JSInterfaceObject : Java.Lang.Object
{
readonly CustomWebView View;
string Data;
public JSInterfaceObject(CustomWebView view)
{
View = view;
}
[Export]
[JavascriptInterface]
// only methods exposed with annotation [JavascriptInterface] are exposed to javascript
public void handleOnClickEvent(string data)
{
Log.ForContext("TAG", TAG).Debug("handleOnClickEvent: " + data);
if(View.OnClick != null)
{
View.OnClick(data);
}
}
}
此界面使用
添加到webview AddJavascriptInterface(new JSInterfaceObject(this), "Internal");
在OnPageStarted
我正在使用
webview.LoadUrl("javascript:"+"var IM={handleOnClick:function(a){Internal.handleOnClickEvent(a)}};");
此设置适用于Android SDK&lt; 24.但是对于SDK中的Webview&gt; = 24,脚本始终会错误地显示missing InjectedNamespace namespace
,这意味着LoadUrl
中的OnPageStarted
失败了!
此检查在脚本中的$(document).ready
中完成。
我在“Android 7.0 for Developers”中找到了这个说明
“从定位到Android 7.0的应用开始,Javascript上下文将会出现 加载新页面时重置。目前,背景是进行的 在新的WebView实例中加载的第一页。
希望将Javascript注入WebView的开发人员应该 在页面开始加载后执行脚本。“
因此尝试在页面开始加载后添加javascript注入代码但得到了相同的错误。还尝试使用WebView.EvaluateJavascript()
,但错误仍然存在。
如果我将TargetSDK更改为&lt; = 23。
,则错误消失