下面介绍iOS平台中NativeCode与JS是如何进行交互的。
objective-c 调用 javascript :
[webView stringByEvaluatingJavaScriptFromString:@"alert('done')"];
javascript 调用 objective-c中的方法,iOS里并未给出直接的注册式调用(像android中的addJavascriptInterface)方式。
而必须要实现 UIWebView中的委托 shouldStartLoadWithRequest 方法,并且通过异步回调的方式把NativeCode执行的结果反馈给JS。这样前端编程模型就需要异步化了,对于需要同步执行的只能另辟蹊径了。
采用伪协议例如:
daxime://callback/class/method/params
在 shouldStartLoadWithRequest 方法中对上面url进行分析,然后进行js方法的回调。
示例:
// Objective-C语言 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSURL * url = [request URL]; if ([[url scheme] isEqualToString:@"daxime"]) { // 在这里做js调native的事情 // .... // 做完之后用如下方法调回js [webView stringByEvaluatingJavaScriptFromString:@"iosNotify('methodIdentifier', ['args1', 'args2'])"]; return NO; // 取消对本次请求的导航 } return YES; // 继续对本次请求进行导航 } // Javascript 语言 (function(global){ var notifyInvoke = function(method, args){ if (global.callbacks[method] && typeof global.callbacks[method] == 'function') { global.callbacks[method].apply(global, args); } else { throw new Error('未实现'); } }; global.iosNotify = notifyInvoke; global.callbacks = {}; /* 注册一个方法 */ global.callbacks["methodIdentifier"] = function(){}; })(window);
资料参考:
http://blog.devtang.com/blog/2012/03/24/talk-about-uiwebview-and-phonegap/
https://github.com/apache/incubator-cordova-ios/