需求如題,如果是你,你一定首先想到看看JavaScriptCore有沒有暴露出對應(yīng)的 delegate 方法可以直接用,抱歉,還真沒有。那該怎么辦?怎么辦?么辦?辦?......
創(chuàng)新互聯(lián)建站是專業(yè)的邵武網(wǎng)站建設(shè)公司,邵武接單;提供成都網(wǎng)站建設(shè)、成都做網(wǎng)站,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行邵武網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
記得之前有一篇關(guān)于 JSBridge 的文章有提到,直接 NSObject 類有一個方法,webView:didCreateJavaScriptContext:forFrame:,從語義上看,應(yīng)該就滿足上面的需求。
好,寫個 NSObject 的分類實現(xiàn)下看看。
測試很簡單,在 web 頁面的 js 腳本里,調(diào)用 printHello(); 即可。
實踐證明:好使!
熟悉 runtime 的話,這個很簡單,調(diào)用 class_copyMethodList 把類里所有的方法取出來打印就好。有的時候,為了分析一個需求如何實現(xiàn),可能要遞歸打印幾個類的方法,從當(dāng)前類,到其父類,到其爺爺類,...直到 NSObject 類。
感謝 oc 語言的創(chuàng)始人和開發(fā)者,每個類的類方法、實例方法都幾乎可以做到望文生義,才讓大家能有這一快樂!
最后,enjoy yourself!
①打開“注冊表編輯器”,找到[HKEY_ CURRENT_USER\Software\Microsoft\Internet Explorer\Desktop\Old WorkAreas],然后選中窗口右側(cè)的“OldWorkAreaRects”,將其刪除。
②同樣在“注冊表編輯器”中找到[HKEY_CURRENT_USER\Software \Microsoft\Internet Explorer\Main],選擇窗口右側(cè)的“Window_Placement”,將其刪除。
③退出“注冊表編輯器”,重啟電腦,然后打開IE,將其窗口最大化,并單擊“往下還原”按鈕將窗口還原,接著再次單擊“最大化”按鈕,最后關(guān)閉IE窗口。以后重新打開IE時,窗口就正常了!
第一種方式是用JS發(fā)起一個假的URL請求,然后利用UIWebView的代理方法攔截這次請求,然后再做相應(yīng)的處理。
我寫了一個簡單的HTML網(wǎng)頁和一個btn點擊事件用來與原生OC交互,HTML代碼如下:
html
header
meta http-equiv="Content-Type" content="text/html; charset=utf-8" /
script type="text/javascript"
function showAlert(message){
alert(message);
}
function loadURL(url) {
var iFrame;
iFrame = document.createElement("iframe");
iFrame.setAttribute("src", url);
iFrame.setAttribute("style", "display:none;");
iFrame.setAttribute("height", "0px");
iFrame.setAttribute("width", "0px");
iFrame.setAttribute("framebor
我們要做的有如下幾件事情:
首先:通過webview加載一個本地html文件
[self.myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"html"]isDirectory:NO]]];
其次:我們要在我們的OC代碼里面注冊JS方法
- (void)h5callApp
{
//獲取該UIWebview的javascript執(zhí)行環(huán)境。
JSContext *context = [self.myWebView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
context.exceptionHandler = ^(JSContext *con, JSValue *exception) {
NSLog(@"%@", exception);
con.exception = exception;
};
context[@"h5CallApp"] = ^() {
NSLog(@"+++++++Begin Log+++++++");
NSArray *args = [JSContext currentArguments];
for (JSValue *jsVal in args) {
NSLog(@"%@", jsVal);
}
JSValue *this = [JSContext currentThis];
NSLog(@"this: %@",this);
NSLog(@"-------End Log-------");
};
}
要保證本地的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里面的方法的。
隨著移動互聯(lián)網(wǎng)流量紅利的逐漸退去,iOS程序員正在面臨開發(fā)崗位增速下降的現(xiàn)實問題,一方面App開發(fā)的熱度在下降,另一方面大型互聯(lián)網(wǎng)平臺相繼推出了自己的小程序生態(tài),在這些因素的綜合影響下,iOS程序員的崗位競爭壓力將進一步加劇。
作為iOS程序員來說,如果想在技術(shù)研發(fā)的道路上走得更遠,可以從以下幾個方面入手:
第一:豐富自身的知識結(jié)構(gòu)。 在當(dāng)前大數(shù)據(jù)以及產(chǎn)業(yè)互聯(lián)網(wǎng)的推動下,軟件開發(fā)的功能邊界在不斷得到拓展,同時由于大量的互聯(lián)網(wǎng)公司開始采用數(shù)據(jù)驅(qū)動的運營方式,所以開發(fā)團隊小型化的趨勢也比較明顯,這就要求程序員要具備更豐富的知識結(jié)構(gòu),以適應(yīng)不同的開發(fā)角色。iOS程序員可以進一步從崗位任務(wù)開始進行知識結(jié)構(gòu)的拓展,比如進一步豐富前端開發(fā)知識就是不錯的選擇,iOS程序員也完全可以走全棧開發(fā)路線。
第二:跳出iOS的生態(tài)圈。 iOS的生態(tài)圈相對來說還是比較封閉的,而且iOS程序員自身可以發(fā)揮的空間也相對有限,主要原因是系統(tǒng)的封閉性所導(dǎo)致的。如果想綜合提升自身的研發(fā)能力,可以考慮跳出iOS的生態(tài)圈。
第三:走研發(fā)級路線。 iOS程序員也完全可以走研發(fā)級路線,走研發(fā)級路線需要做好三件事,其一是選擇一個主攻方向;其二是有扎實的基礎(chǔ)知識儲備;其三是能夠不斷完成崗位升級,從而獲得更多的資源整合渠道。不少應(yīng)用級程序員在發(fā)展的過程中會遇到較大的上升瓶頸,通過讀研來完成崗位升級也是一個比較常見的選擇。
如果有互聯(lián)網(wǎng)、大數(shù)據(jù)、人工智能等方面的問題,或者是考研方面的問題,都可以在評論區(qū)留言!
微信適配夜間模式了嗎?這就是例子,強者話語權(quán),ios先天的系統(tǒng)優(yōu)勢就是一個市場的錨點,微信知道自己的命根子在哪,為硬件設(shè)備提供極致操作的工具,例如Metal,無可匹敵,再說ios系統(tǒng)核心的源代碼,與高端服務(wù)器os unix一脈相承,又有進一步的嵌入式操作,核心api專業(yè)打磨,絕對不是開源系統(tǒng)能比的量級,說白了每個環(huán)節(jié)都是錢砸出來的,靠的都是工匠精神,核心源碼是任何一個程序員的寶藏,不要認為玩過幾個跨平臺根本不考慮性能的js小技術(shù)就明白了一切,只要去過Google開發(fā)者大會的就知道,看看安卓程序員手里吃飯的家伙是啥,mac,頂上的葉子再多也要靠下面的根,喬布斯,一騎絕塵
去開發(fā)華為系統(tǒng)的APP,動作要快
轉(zhuǎn)后端 Java PHP go py都學(xué)一波
我干過大概一年的iOS開發(fā),后來又轉(zhuǎn)回java了,說句實話,iOS對開發(fā)者確實友好,一切都很不錯,開發(fā)工作也很愉快,但是后來工作不太好找,而且iOS開發(fā)的發(fā)展深度沒有java深,java深入不僅僅是curd,還有架構(gòu)、框架、微服務(wù)、分布式 等等。而且java到架構(gòu)之后,薪資也比iOS要高很多,不過我不建議你學(xué)我,除非你有毅力學(xué)習(xí)java,因為我除了有iOS開發(fā)經(jīng)驗之外,還有五年的java經(jīng)驗,說轉(zhuǎn)也就轉(zhuǎn)了。
作為IT行業(yè)的從事多年的程序狗,我來解答下您的這個問題。
2015年到2017年可能是IOS最熱的一段時間,大量的軟件開發(fā)人員投入IOS的市場。現(xiàn)今隨著蘋果公司的銷量不斷受挫。IOS的市場也是不溫不火。
IOS開發(fā)程序員,其實可以嘗試這跳出這個生態(tài)舒適圈,軟件這個行業(yè)是多向選擇的,軟件的開發(fā)思想、程序的設(shè)計思想都是大同小異的。對于一個精深I(lǐng)OS開發(fā)人員來說,對于別的語言多少都會掌握一些,這對于您跳出IOS的圈也是一大幫助。畢竟Java、Python現(xiàn)在是市場上的主流語言。
另一個方面就是很多資深程序員選擇的,進入深層次領(lǐng)域的學(xué)習(xí)。走研發(fā)級的一些路線。研發(fā)級軟件研發(fā)的職位生命周期長。工作壓力會比程序員小很多,很適合大齡程序員的選擇。
或者就是選擇自己的一個主攻方向,做這個方向的專家,這也不失為一種選擇。豐富自身的知識結(jié)構(gòu),向著全棧開發(fā)工程師不斷的前進。
或者可以嘗試這轉(zhuǎn)行管理層,做一些技術(shù)經(jīng)理、技術(shù)總監(jiān)。當(dāng)然任何一種選擇都需要您結(jié)合自身的實際情況去抉擇。謹慎考慮、然后在做選擇。
希望回答對您有所幫助。
我本人從事多年互聯(lián)網(wǎng)Java開發(fā),感興趣的朋友可以關(guān)注私聊,共同努力,共同進步。
謝謝!
我是8年iOS開發(fā)從業(yè)者,結(jié)合我自身情況以及我自己的職業(yè)規(guī)劃,希望能夠幫到你。
焦慮 今年已經(jīng)三十歲了,對于iOS的現(xiàn)狀和未來也時常感到焦慮,大齡程序員未來的出路在哪,我也會迷茫。
市場需求 移動開發(fā)需要iOS,安卓兩端一起開發(fā),耗費的時間成本是企業(yè)會考慮的,再加上html5、小程序、各種跨端方案的出現(xiàn),市場對原生開發(fā)需求更少了。
案例 再分享一個之前做主管時我招聘C++開發(fā)的一個經(jīng)歷,杭州C++需求量不大,但是這位應(yīng)聘者能力過硬,最終進了華為。
我們應(yīng)該怎么做 上面的案例也印證了只要自身技術(shù)過硬,只要市場還有需求,過多的擔(dān)心和焦慮是沒有必要的,把大量的時間花在 探索 未來方向,不如沉下心來學(xué)習(xí)技術(shù),努力提高自己,成為不可替代的人才。其實應(yīng)對焦慮最好的方法是行動,目前市場更需要的是高端人才,只要有崗位需求,把自身能力提高上去之后,現(xiàn)在所擔(dān)憂的問題都會迎刃而解。
希望我的回答對你有幫助,隨時歡迎留言反饋。
flutter歡迎你
轉(zhuǎn)其他語言,或者自己獨立開發(fā)
我鼓搗flutter去了
前端開發(fā)最重要的基礎(chǔ)就三門技術(shù) jvascript+css+html,js是其中最重要的
ps可以不掌握,工作的時候一般只需要會切圖就行,而且很多公司會讓作圖的人切好圖,你可以不考慮
flash完全不用理會,pc上flash日漸消沉,無線上早就死光光了
我想說的 最重要的,就是基礎(chǔ),深入掌握一下javascript和css基礎(chǔ),這兩個是無論是面試相關(guān),跟以后的項目開發(fā),都是最息息相關(guān)的。如果時間不夠的話,重點掌握javascript,推薦兩本書,你選其中一本就行,一是犀牛書(javascript權(quán)威指南),另外一本是javascript高級程序設(shè)計(尼古拉斯大神的書,目前第三版),重點掌握js語法基礎(chǔ),ajax,面向?qū)ο笙嚓P(guān)(基于原型的繼承等高級技術(shù))。
css推薦 css權(quán)威指南一書,css學(xué)習(xí)是很枯燥的,一般在項目過程中才能不斷掌握,如果沒有條件,可以重點學(xué)一下選擇器,定位,盒模型和浮動這幾章。
jquery在很多公司或者整個前端界用的居多,但在很多大公司面試時(像我在百度面試時,人家都豪不理會),因為這些公司重視的是基礎(chǔ),項目經(jīng)驗可以培養(yǎng),但基礎(chǔ)需要花狠勁才能掌握牢固。這些框架對你現(xiàn)在的作用是熟悉一下源碼,看看它們怎么實現(xiàn)的。我也是大三才學(xué)的前端,并且邊讀框架邊學(xué)的js,如果你對這樣學(xué)感興趣,推薦你讀一下prototype.js的源碼。jquery的源碼太過講究技巧,不太適合初學(xué)者去讀。
最后談一下準(zhǔn)備作品這塊,去年開始前端界衍生了一個新的職位,叫無線前端開發(fā)工程師,說白了就是在iphone和android手機上做網(wǎng)站,用到的技術(shù)基礎(chǔ)還是js跟css,但不需要像pc那樣考慮兼容性(IE6是很惡心的),最重要的,就是對html5和css3支持度比較高,這個職位目前還是很熱門的,你可以往這個方向發(fā)展,掌握好基礎(chǔ)后學(xué)這些新技術(shù)還是很容易的。利用css3和html5寫一些demo絕對可以讓考官眼前一亮。
如果你學(xué)了一學(xué)期掌握了基礎(chǔ),可以嘗試聯(lián)系我,百度還是很歡迎熱愛技術(shù)的人的,特別是女生(嘿嘿),最后祝你成功。