Чтобы соответствовать вызовам методов iOS WebviewJavascriptBridge (https://github.com/marcuswestin/WebViewJavascriptBridge), я создал прокси для вызовов register_handle
и call_handle
.Обратите внимание, что я не гуру Javascript, поэтому, вероятно, есть лучшее решение.
javascriptBridge = (function() {
var handlers = {};
return {
init: function () {
},
getHandlers : function() {
return handlers;
},
callHandler : function(name, param) {
if(param !== null && param !== undefined) {
JSInterface[name](param);
} else {
JSInterface[name]();
}
},
registerHandler : function(name, method) {
if(handlers === undefined) {
handlers = {};
}
if(handlers[name] === undefined) {
handlers[name] = method;
}
}
};
}());
Таким образом, вы можете отправлять из Javascript вызовы Java, которые могут иметь параметр String
javascriptBridge.callHandler("login", JSON.stringify(jsonObj));
вызывает
@JavascriptInterface
public void login(String credentialsJSON)
{
Log.d(getClass().getName(), "Login: " + credentialsJSON);
new Thread(new Runnable() {
public void run() {
Gson gson = new Gson();
LoginObject credentials = gson.fromJson(credentialsJSON, LoginObject.class);
SingletonBus.INSTANCE.getBus().post(new Events.Login.LoginEvent(credentials));
}
}).start();
}
, и вы можете перезвонить в Javascript с помощью
javascriptBridge.registerHandler('successfullAuthentication', function () {
alert('hello');
})
и
private Handler webViewHandler = new Handler(Looper.myLooper());
webViewHandler.post(
new Runnable()
{
public void run()
{
webView.loadUrl("javascript: javascriptBridge.getHandlers().successfullAuthentication();"
}
}
);
Если вам нужно передать параметр, сериализуйте вЗатем в строку JSON вызывается StringEscapeUtils.escapeEcmaScript(json)
, в противном случае вы получите ошибку unexpected identifier: source (1)
.
Немного безвкусно и хакерски, но это работает.Вам просто нужно удалить следующее.
connectWebViewJavascriptBridge(function(bridge) {
}
РЕДАКТИРОВАТЬ:
, чтобы изменить глобальную переменную на фактическое свойство, я изменил приведенный выше код на следующее:
(function(root) {
root.bridge = (function() {
var handlers = {};
return {
init: function () {
},
getHandlers : function() {
return handlers;
},
callHandler : function(name, param) {
if(param !== null && param !== undefined) {
Android[name](param);
} else {
Android[name]();
}
},
registerHandler : function(name, method) {
if(handlers === undefined) {
handlers = {};
}
if(handlers[name] === undefined) {
handlers[name] = method;
}
}
};
}());
})(this);
Я получил идею от глобального модуля Javascript или глобальной переменной .