前言
隨著移動互聯(lián)網(wǎng)的興起娱颊,Webapp開始大行其道。大概在15年下半年的時候我接觸到了HybridApp凯砍。因為當(dāng)時還沒畢業(yè)嘛箱硕,所以并不清楚自己未來的方向,所以就投入了HybridApp的懷抱悟衩。
HybridApp最早好像是國外的PhoneGap剧罩,然后國內(nèi)有AppCan、Dcloud座泳、APICloud等等惠昔。我當(dāng)時接觸的是APICloud,相比于其他平臺挑势,APICloud最大的特點是它的混合程度比較高镇防!
要知道,Webapp最大的問題就是性能問題始終無法和原生App相比潮饱,由此才發(fā)展出來HybridApp来氧。
界內(nèi)公認(rèn)的最穩(wěn)定的的Hybrid開發(fā)方式就是:由Native解決交互問題,由H5解決應(yīng)用層問題香拉。比如AppStore就是采用這種模式啦扬。
在這一點上APICloud做的還是不錯的,它的交互都是調(diào)用原生的接口凫碌,而應(yīng)用層開發(fā)者可以自行通過H5進(jìn)行開發(fā)扑毡。
當(dāng)然了,HybridApp的坑還是比較多的证鸥。在大概半年的時間里我踩了無數(shù)的坑。勤晚。枉层。
想起來都是淚啊。
不說了赐写,今天說說React Native鸟蜡。
React Native
因為Hybrid的平臺太多了,所以一直以為React Native也是一種HybirdApp開發(fā)方式挺邀。
最近想做一個監(jiān)聽手機(jī)短信的APP揉忘,所以就又用APICloud嘗試了下跳座,結(jié)果只能監(jiān)聽到正規(guī)手機(jī)號發(fā)送的短信卻監(jiān)聽不到短信通道發(fā)送的。我以為是APICloud的模塊問題泣矛,所以就想著看看React Native能不能幫我解決這個需求疲眷?
了解RN之后才發(fā)現(xiàn),完全不是我想的那樣D唷狂丝!
之前的各種HybridApp開發(fā)方式,它們的原理其實就是在一個運行在Webview中的app哗总,只不過這個Webview比較特殊而已几颜。
而RN完全不是這樣!
RN是最終還是會把你寫的代碼轉(zhuǎn)換成原生的代碼進(jìn)行編譯讯屈。這就意味著RN開發(fā)出來的APP是無限接近原生APP的性能的蛋哭!
FB真是牛逼到家了!涮母!
具體的RN開發(fā)我還沒深入谆趾,這里就不誤人子弟了。
下面就說說RN到底能不能幫我解決監(jiān)聽短信的問題呢哈蝇?
當(dāng)時是棺妓。。炮赦。額怜跑。。吠勘。沒解決性芬。。剧防。
哈哈~
其實沒解決不是因為RN的問題植锉,具體的原因我最后再說。
我查遍了RN的文檔峭拘,最終確定確實是沒有SMS相關(guān)的API和模塊俊庇。
無奈之下只能在網(wǎng)上搜索下咯~
這里我就要夸一夸我大Google了。
在百度上搜索ReactNative SMS鸡挠,毛也沒有搜到辉饱!
在Google上立馬搜到了很多。
成功找到一個React-native-sms-listener的模塊拣展,是一個巴西的開發(fā)者開發(fā)的彭沼。
興奮的去安裝編譯,結(jié)果又掉坑里了备埃。姓惑。褐奴。
在坑里爬了半天,發(fā)現(xiàn)是因為RN的版本升級了于毙。敦冬。。
在RN的0.29版本中望众,Android的原生代碼中增加了一個MainApplication.java的文件匪补,原先的MainActivity.java的文件也有所調(diào)整。烂翰。夯缺。
而這個React-native-sms-listener的模塊安裝的時候要求將他的一段代碼寫到MainActivity.java中去,結(jié)果就當(dāng)然可想而知了甘耿,編譯的時候死活無法通過踊兜。抓狂~
然后又費了半天勁給RN進(jìn)行降級。
這里也提一嘴如何給RN降級佳恬,官網(wǎng)的文檔只提了如何升級卻沒有如何降級捏境,這又是一個小坑。
因為是通過npm進(jìn)行管理的毁葱,所以會有一個package.json的文件垫言。這個文件里指定了RN的版本,安裝好之后就是最新版本倾剿,如果官網(wǎng)版本有更新筷频,那么你這里的版本就會落后了,那么升級的時候就是需要把這個版本號改為最新的版本然后執(zhí)行npm install.
升級很簡單前痘,降級需要注意的是凛捏。你需要先把Android相關(guān)的代碼全部刪掉。
就是圖中的android文件夾和index.android.js的文件全部都刪掉芹缔。然后將package.js中的版本號調(diào)整為要降到的版本坯癣,最后執(zhí)行npm install就可以了。
為什么要刪掉最欠?官網(wǎng)文檔中有提到的
如果是新添加的文件示罗,則直接創(chuàng)建。
如果文件和當(dāng)前版本的文件相同芝硬,則跳過蚜点。
如果文件和當(dāng)前版本的文件不同,則會提示你一些選項吵取。
這就意味著禽额,如果新版本有新文件而舊版本并沒有锯厢,它是不會自動刪掉的皮官。這就會導(dǎo)致編譯的時候出現(xiàn)一些莫名奇妙的錯誤脯倒。。捺氢。
最終
成功的寫了一個監(jiān)聽短信的App藻丢,可惜還是監(jiān)聽不到通過短信通道發(fā)來的短信。摄乒。悠反。
我又一度懷疑是不是巴西那哥們寫的模塊有問題。馍佑。斋否。
反正Android的開發(fā)環(huán)境都搭好了,索性自己用原生的方式寫一個吧拭荤。
查了下資料茵臭,發(fā)現(xiàn)想要監(jiān)聽短信有兩種方式,一種是監(jiān)聽廣播舅世,一種是監(jiān)聽短信數(shù)據(jù)庫旦委。
首先嘗試了監(jiān)聽數(shù)據(jù)庫,經(jīng)過一番調(diào)試終于可以監(jiān)聽到了雏亚,趕緊找個渠道發(fā)個驗證碼試試缨硝。激動~~
可是。罢低。查辩。
尼瑪!^榷獭宜肉!
還是監(jiān)聽不到!t岜谬返!
這時候我突然想起一件事:MIUI的短信列表被特殊處理了拴签!
如上圖铺董,它把通知類的短信和普通短信進(jìn)行了區(qū)分把通知類的短信摘出去了。忘闻。
坑啊~
這TM肯定不在一個數(shù)據(jù)庫了莉擒。酿炸。。
想明白這個問題之后都無奈了涨冀,折騰半天是手機(jī)系統(tǒng)的問題填硕。。。
然后又嘗試了下監(jiān)聽廣播的方式扁眯,也宣告失敗壮莹。
猜測miui底層應(yīng)該在自身接收到廣播做完相應(yīng)處理就把廣播攔截掉了。姻檀。
好了命满,本周的踩坑記就分享到這里了~
彩蛋
看過我之前文章的都知道我為什么要做短信監(jiān)聽。我說過打算做兩個Sender绣版,一個是App胶台,一個是基于SIM900A的小嵌入式產(chǎn)品。App的版本暫時就這樣了杂抽,等我給我的M4刷個其它的ROM再說诈唬。
喜訊是SIM900A調(diào)用Http請求時總重啟的問題順利解決了!缩麸!
原來是電腦USB電流輸出不足導(dǎo)致的讯榕,外接了個電源立馬好了~
請叫我踩坑小王子~