需求說明
應用市場經(jīng)常需要搞些活動脖旱,而活動頁一般都是h5頁面堪遂,而一般搞活動的目的都是提升某些app的下載量,這就需要該活動頁支持下載萌庆,而據(jù)我了解溶褪,網(wǎng)頁是不支持下載的,就算網(wǎng)頁支持下載践险,一般需求也是需要調用app的下載模塊來下載猿妈,所以這里就涉及到了android和網(wǎng)頁的交互。
流程分析
網(wǎng)頁一般需要一些用戶信息巍虫,如用戶的剩余抽獎次數(shù)彭则,累積積分等。如果不通過網(wǎng)頁接入第三方登錄sdk的方式(如微信登錄)來獲取用戶信息的話占遥,那么網(wǎng)頁就只能通過和原生代碼交互的方式來獲取用戶信息了俯抖,因此我們考慮在android端留一個供網(wǎng)頁獲取信息的接口:String getUserInfo();注意,用戶數(shù)據(jù)在傳遞前應先加密瓦胎。
由于網(wǎng)頁中的app狀態(tài)需要從手機本地獲取芬萍,因此android端需要有一個供網(wǎng)頁注冊獲取app狀態(tài)監(jiān)聽器的接口:registerAppStateChangeListener(包信息);在網(wǎng)頁關閉后需要注銷該網(wǎng)頁所有的監(jiān)聽器。同時網(wǎng)頁端也要提供一個供android端回調狀態(tài)給網(wǎng)頁的接口:updateAppState(包信息);
網(wǎng)頁中的app按鈕的響應應該交由android端處理:onButtonClick(包信息);
至此搔啊,所有的流程應該都能走通了柬祠。
android端實現(xiàn)
由以上分析可得出android端的實現(xiàn)如下:
- 創(chuàng)建js接口并提供以下方法:
@android.webkit.JavascriptInterface
public String getUserInfo() {
return info;
}
@android.webkit.JavascriptInterface
public void registerAppStateChangeListener(String json) {
//注冊監(jiān)聽
}
@android.webkit.JavascriptInterface
public void onButtonClick(final String json) {
//處理點擊邏輯
}
由于下載的邏輯各有不同,因此這里只說一下思路负芋,就不貼相關代碼了漫蛔。首先,網(wǎng)頁加載的過程中可以調用getUserInfo方法獲取用戶信息示罗,這里要注意的是惩猫,只要是涉及到做任務領積分之類的情景,則在上傳用戶信息時最好對用戶信息做一下驗證處理蚜点,以防止惡意刷分的情況出現(xiàn),我的處理思路是這樣:info+salt+sign拌阴,其中sign是把info做一些加密處理得到的绍绘,具體怎么加密是你的自由,網(wǎng)頁驗證的時候只要取出info迟赃,然后根據(jù)定好的規(guī)則生成sign陪拘,再把生成的sign和傳過來的sign比對,一樣的就視為驗證通過纤壁。而剩下的salt就像它的名字一樣左刽,配料而已,用來混淆視聽的啦酌媒。
由于app的狀態(tài)只能通過android端來調用網(wǎng)頁端的方法來通知欠痴,這里就涉及到了android調用js迄靠,此處會有一個大坑Android調用js的坑,即所有的webView方法需要在同一線程調用喇辽,否則就會報錯掌挚。
這里還有一個地方要注意,傳遞數(shù)據(jù)最好傳json菩咨,這是為了方便以后的拓展吠式,比如在我的項目中onButtonClick需要傳遞app包名過來,如果這一次不傳json抽米,在以后迭代版本時假如又要添加一個字段特占,這時候你選擇傳遞一個json,新的版本當然支持云茸,但老的版本由于數(shù)據(jù)格式不同會出現(xiàn)解析錯誤是目,如果一開始就使用json就能避免這個問題了。
還有查辩,如果app有混淆的話胖笛,記得不能混淆聲明的接口,否則網(wǎng)頁將無法找到該接口宜岛〕び唬混淆如下:
#網(wǎng)頁接口不能被混淆
-keepattributes *Annotation*
-keepattributes JavascriptInterface
-keep class com.xxx.xxx.activities.Html5Activity$JsInteration { *; }
網(wǎng)頁端實現(xiàn)
由于我對網(wǎng)頁端不熟,只能現(xiàn)學現(xiàn)做萍倡,這里遇到了一個坑身弊,就是js方法如果有用到獲取元素的方法,那么此方法就需要放在元素聲明之后列敲。
效果
由于app涉及到下載管理的代碼阱佛,想要做個demo又得抽取下載管理的代碼,demo就有點龐大了戴而,所以就不做demo了凑术。。所意。