我目前正在尝试将现有的Android应用程序移植到IOS应用程序。这里的问题是,我们的Android应用程序的很大一部分是使用大量的Web视图和Android调用的自定义Javascript代码制作的。
如果有人不熟悉它,android的代码会是这样的:
mWebView.addJavascriptInterface(WebInterface(this), "Android");
// more settings or whatever
mWebView.loadUrl("yourUrl.html.whatever");
然后,Javascript代码的界面如下所示:
public class WebInterface {
Context mContext;
public WebInterface(Context c) { this.mContext = c;}
@JavascriptInterface
public String returnMessage() {
Toast.makeText(mContext, "This is being called from the interface", Toast.LENGTH_SHORT).show();
return "This is being called from the interface";
}
}
此时,只要我们想要访问webview中returnMessage()
方法的代码,我们只需调用:
var getContentsFromIntefrace = Android.returnMessage()
// getcontentsFromInterface is now "This is being called from the interface"
这些有针对性的调用(Android.returnMessage()
)只允许我在需要时调用接口代码,相反,如果我要使用Android API的评估javascript方法,我必须注意代码在整个地方执行,例如,如果我的evaluatejavascript Android API方法将变量设置为代码中存在所述变量的任何其他部分中的变量(如果我错了,请纠正我,起初它似乎模糊但是它到目前为止是一个问题)
=====我与IOS有关的问题
以上仅仅是对我需要做的解释,以显示我在IOS上尝试的内容我将演示代码:
在IOS中如果我想要在我的控制器中调用swift代码的函数,我必须在JS中设置它:
function testButton() {
webkit.messageHandlers.callbackHandlerTestSend.postMessage({action: "testButtonAction", data: {name: "E.A.P"}});
}
上面发送一条命名消息('callbackHandlerTestSend'),其中包含操作和数据的键值对,可以在适当的swift委托上解析为:
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if (message.name == "callbackHandlerTestSend") {
guard let body = message.body as? [String:Any] else {
print("Unable to do connection")
return
}
for(key, value) in body {
print("\(key) : \(value)")
if(key == "action"){
if(value as! String == "testButtonAction") {
intCounter += 1
print("The testButtonAction message action has been called")
webView.evaluateJavaScript("receiverP.innerHTML = 'It works \(intCounter)'", completionHandler: nil)
webView.evaluateJavaScript("receiverFunction('Message test')", completionHandler: nil)
// FIXME: evaluate JS might call on any other instance of receiverP, this is an issue
}
}
}
}// body of if
}// end of delegate
这是我能够通过使用webview
webView.evaluateJavascript()
的唯一方式
我的问题是我需要用整体捕捉所有内容:
webkit.messageHandlers.callbackHandlerTestSend.postMessage({action: "testButtonAction", data: {name: "E.A.P"}});
继续执行此操作以及必须单独解析每个调用以设置正确的参数同时尝试不注入javascript代码而不会弄乱其他内容变得麻烦。因此,调用javascript和发送javascript代码在这一点上看起来非常麻烦,我想知道是否有一些我可以做的代码看起来更像Android对应。
关于我可以使用哪些很酷的外部库或者如何将代码修改为此的任何建议将非常感激,我一直试图在IOS文档中找到一些东西但是没有发现任何我可以使用的东西
- 编辑:
此时我正在认真考虑React Native等替代方案,因为它似乎是开发应用程序的最快途径,需要大量使用网络内容以及与Android相比对IOS的了解有限。我仍然想知道上述是否有可行的解决方案。