標籤:
1. webview.addJavascriptInterface() doen not work on API 16+
常見的用戶端與H5的混合編程是使用scheme+、JS bridge、provider等。
在做Android 與 H5 用戶端互動時,發現一個很詭異的錯誤。在一個4.2.2的 三星S3上,Android Javascript Bridge 會出現回調出錯。
所有掛在Bridge對象下的函數均無法找到。於是一點點排查問題到底出現在哪。
其他手機H5混合編程訊息回調正常,本以為是因為是旅行V3.0是基於Fragment引起的,即fragment下不能使用。後來經過排查發現不是這個問題。
發現就是手上的一台S3不行,其他基本都可以進行訊息回調。
排查了一大圈,發現在Android SDK Target API Level 16+的情況下,使用以往的方式進行Native 與 H5進行混合編程均無法搞定。
解決辦法:
- 推薦使用較高的Target SDK去編譯【4.0+】.
2. 在Javascript Bridge對象下的所有回調方法使用 @JavascriptInterface 進行註解聲明
3. 需要 import android.webkit.JavascriptInterface;
使用4.0+版本的Target SDK時,需要注意對回調方法進行註解聲明!這種坑 很難發現,使用類似的混合編程技術的團隊請關注這點~
裝置ROM版本 |
開發環境 Target SDK |
不用註解,訊息是否能生效 |
<4.0 |
>4.0 |
Ok |
<4.0 |
<4.0 |
Ok |
>4.0 |
>4.0 |
NO |
<4.0 |
>4.0 |
OK |
public class J2NBridgeManager {
@JavascriptInterface
public void startNativeService(String schemeUrl) {
// js回調為空白 則直接返回
if (TextUtils .isEmpty(schemeUrl)) {
return;
}
final TripURL mServiceUrl = Utils.getURIByUrlWithDecoded(schemeUrl);
// 執行本地一個service ,非同步處理完後,回調js
mHandler.post( new Runnable() {
@Override
public void run() {
doService(mServiceUrl);
}
});
}
}
參考文章:
如何建立通訊: http://stackoverflow.com/questions/13063222/web-view-addjavascriptinterface-issue
解決問題說明: http://stackoverflow.com/questions/16353430/appview-addjavascriptinterface-doen-not-work-on-api-17
2.android 5.0+版本的訊息分享,無法通過scheme喚起 第三方用戶端
之前我們會通過provider 在webview中JS檢查手機是否安裝旅行用戶端,然後通過下面的方式進行邏輯分發:
通過scheme喚醒第三方用戶端,在<5.0版本前均可以通過window.location.href = ‘taobaotravel://h5_homepage‘;的自訂的scheme去實現,但是5.0版本後,貌似是在的webview中進行了url過濾,對應非信任的url進行了屏蔽,所以導致不能發起scheme去喚醒用戶端。
關於URL白名單這個東西,目前僅僅為猜測,如果誰有的那邊的朋友【研發團隊是在廣州】,可以幫忙確認下。
如果確認是加了白名單,目前通過5.0+webview喚醒我們的第三方app將變成死路。。。。
如果能通過商業合作的方式也是可取的
| if(isMac) { |
| |
if(getAvailabled()) { |
| |
$(‘J_btn‘).innerHTML = ‘旅行啟動中…‘; |
| |
|
| |
setTimeout(function() { |
| |
if(window.location.href.match(‘promo-assit.php‘)) { |
| |
window.location.href = ‘taobaotravel://h5_homepage‘; |
| |
$(‘J_btn‘).innerHTML = ‘啟動旅行用戶端‘; |
| |
return; |
| |
} |
| |
|
| |
window.location.href = ‘taobaotravel://h5_webview?‘ + param; |
| |
$(‘J_btn‘).innerHTML = ‘啟動旅行用戶端‘; |
| |
}, 1300); |
| |
} else { |
| |
// 跳活動頁面 |
| |
if(window.location.href.match(‘promo-assit.php‘)) { |
| |
window.location.href = ‘http://lv.taobao.com/‘; |
| |
} else { |
| |
window.location.href = fixUrl(jmpurl); |
| |
} |
| |
} |
| |
} |
android addJavascriptInterface 不能生效 解決辦法