這兩天真是愁,早上6點起床從老家來公司欲诺,弄得一整天腦子都只有一個字圍繞著我——“困”抄谐。
本來就很匆忙的項目,雪上加霜換需求扰法,項目里面原來通過url與javastrip交互的全換了蛹含。項目的最低系統(tǒng)要求提升至7.0,“JavaScriptCore”這個framework終于可以用起來,雖然我也不知道它為何物塞颁,只是聽說它為JS與OC提供了很好的溝通橋梁浦箱,換句話,IOS終于可以像安卓那樣與JS愉快的溝通了祠锣,但也僅僅是像酷窥,折磨我的日子是今天。
為了完成這個需求伴网,首先我參考一些博客寫了一個demo用了本地的一個html做試驗蓬推,非常OK,點我看博客。
當(dāng)項目經(jīng)理問我實現(xiàn)了交互沒有的時候澡腾,我真的很自信的回答沸伏,demo已經(jīng)寫好了,應(yīng)該沒問題动分,當(dāng)項目經(jīng)理把我們的需求告訴我的時候毅糟,我真想抽自己一巴掌啊。我們的需求是JS先調(diào)用OC方法,把自己的一些參數(shù)傳給OC澜公,OC里面請求完成后姆另,再把結(jié)果告訴JS。覺得很容易的大神請繞過玛瘸,接下來我要講為了這需求蜕青,我忙活了大半天,還是通過別人的代碼完成的糊渊。
我們要做的有如下幾件事情:
首先:通過webview加載一個本地html文件
NSString *htmlPath=[[NSBundle mainBundle] resourcePath];
htmlPath=[htmlPath stringByAppendingPathComponent:@"html/test.html"];
NSURL *localURL=[[NSURL alloc]initFileURLWithPath:htmlPath];
[self.mWebV loadRequest:[NSURLRequest requestWithURL:localURL]];
其次:我們要在我們的OC代碼里面注冊JS方法
- (void) h5CallApp: (NSString*) param And2: (NSString*) param2 And3: (NSString*) param3
{
NSLog(@"test with param: %@ and param2: %@ and param3: %@", param, param2,param3);
}
要保證本地的html里面有h5CallApp這個方法哦右核。
這就是剛剛上述博客里面提到的方法,是不是看上次很簡單的樣子渺绒。
But
我運用到我們項目里面的時候贺喝,死活不能調(diào)用該方法菱鸥,why?我厚著臉皮問了我們的帥哥安卓開發(fā)躏鱼,得知他們里面有這一樣一行代碼
webView.addJavascriptInterface(new JSInvoke(), "test");
看上去第一眼的感覺是不是累似注冊了一個東西氮采,可是我找了好多博客我沒有找到我們IOS類似的啊,著急啊著急染苛。
意外的意外鹊漠,偉大的github上面就是資源多,我在上面找到一個EasyJSWebViewSample這樣一個開源項目茶行,里面有一句
MyJSInterface* interface = [MyJSInterface new];
[self.myWebView addJavascriptInterfaces:interface WithName:@"MyJSTest"];
是不是感覺和安卓里面的那個注冊類似的躯概,沒錯,太開心了畔师。
最后的最后娶靡,你以為結(jié)束了,NO!
該Demo里面的html有空的小朋友可以看一下看锉。
由于項目需求我們是3個參數(shù)姿锭,在該demo里面執(zhí)行拿到第一個參數(shù),該demo就運行出錯伯铣,提示我們數(shù)組越界了呻此,在這里真的浪費了好多時間,后來發(fā)現(xiàn)他們的demo里面調(diào)用兩個參數(shù)的方法在JS里面聲明的方法與OC里面真正的實現(xiàn)方法有點差入懂傀,比如OC里面定義的方法
- (void) h5CallApp: (NSString*) param And2: (NSString*) param2 And3: (NSString*) param3
在html里面只能寫成
MyJSTest.h5CallAppAnd2And3("param1","param2","param3")趾诗。
是不是覺得不可思義,最后我整體看了一下代碼蹬蚁,里面好像有這一段在注入JS的時候有用到的
inject: function (obj, methods){
window[obj] = {};
var jsObj = window[obj];
for (var i = 0, l = methods.length; i < l; i++){\\
(function (){
var method = methods[i];
var jsMethod = method.replace(new RegExp(\\":\\", \\"g\\"), \\"\\");
jsObj[jsMethod] = function (){
return EasyJS.call(obj, method, Array.prototype.slice.call(arguments));
};
})();\\
}
}
這個好像是替換方法的,原諒我的無知啊郑兴,我也是沒看懂犀斋,僅僅是感覺與猜測,勿噴我情连,我真的怕被噴叽粹。
最后的最后,JS的那邊的開發(fā)肯定是不會為了將IOS與安卓開發(fā)做區(qū)分寫代碼的却舀,所以我只能在注入JS完成后加了這么一句
[webView stringByEvaluatingJavaScriptFromString:@"test.h5CallApp=test.h5CallAppAnd2And3;"]
這句話的作用是替換JS里面的方法的虫几。
唉,偽程序媛還是無法將一個東西描述得很清楚挽拔,不過如果你有更好的方法辆脸,請記得告訴我。還有1個多小時就到傳說的雙11螃诅,但是與我有什么關(guān)系呢啡氢,睡覺吧状囱,晚安,各位倘是。
最后的最后,你們要的Demo來了搀崭,希望滿意。點我看Demo啦瘤睹。