Hybrid 開發模式已不是什麼新鮮的話題,不只能夠快速發佈新業務,同時無需考慮 App 發版時間,爲業務更新迭代提供了極強的靈活性。相比於 Web 開發,Hybrid 開發模式提供了豐富的設備 API,讓業務形態能夠更加多元和豐富。html
mPaaS 離線包源自於支付寶原生方案,經歷了嚴苛的業務考驗,讓你直接和支付寶使用同一套框架層代碼,擁有統一容器及內核,相對系統內核獲取更低 Crash 率和 ANR 率,適配性強,並具有良好的、彈性的擴展能力,結合具體業務需求定製 JSAPI。git
問題一、HTML5 容器加載時,若是加載錯誤僅回調 H5_PAGE_FINISHED,並無回調 H5_PAGE_ERROR。如何處理 H5_PAGE_ERROR,用原生的錯誤展現界面。github
答: H5_PAGE_ERROR 事件是容器內部事件,會被內部插件攔截,目前開發者沒法直接使用。 能夠實現 H5ErrorPageView,在 errorPageCallback 啓動原生頁面。web
Step1: 新建一個 HTML 格式的自定義錯誤頁框架
<!doctype html>
<html lang="zh-cn">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no" />
<meta name="format-detection" content="telephone=no" />
<title>自定義錯誤</title>
</head>
<body>
<p>這個頁面是一個自定義錯誤頁</p>
</body>
</html>
複製代碼
Step2: 實現 H5ErrorPageView。將剛纔建立的錯誤頁,設置給 APWebView
ide
public class H5ErrorPageViewImpl implements H5ErrorPageView {
@Override
public boolean enableShowErrorPage() {
// true 表示啓動自定義錯誤頁
return true;
}
@Override
public void errorPageCallback(H5Page h5Page, APWebView view, String errorUrl, int statusCode, String errorMsg, String subErrorMsg) {
// 獲取錯誤頁的 html,demo 中放到了 raw 中,也能夠放在其餘地方
String html = H5ResourceManager.readRawFromResource(R.raw.custom_error, LauncherApplicationAgent.getInstance().getApplicationContext().getResources());
// 將錯誤頁設置給 webview
view.loadDataWithBaseURL(errorUrl, html, "text/html", "utf-8", errorUrl);
}
}
複製代碼
Step3: 註冊 H5ErrorPageView。在打開 H5 容器以前,將自定義的 H5ErrorPageView 註冊給容器。性能
H5Utils.setProvider(H5ErrorPageView.class.getName(),new H5ErrorPageViewImpl());
複製代碼
具體請參考:tech.antfin.com/docs/2/1269…優化
問題2:自定義 JSAPI 調取攝像頭拍完照後,插件不能繼承 H5Acitivity,沒法寫 onActivityResult 回調this
答: 目前您可使用一個透明 activity 來啓動相機,並接收返回參數,而後再經過廣播(或其餘手段通知您的 JSAPI) 因爲咱們在 H5Activity 中作了很多的工做,因此暫時不能開發繼承 H5Activity,不過這是一個很是好的 issue,後續咱們看是否能夠開發一些 H5Activity 的回調來解決這個問題。spa
問題3:Android 如何不預置 H5 的狀況下,直接下載離線包?
答:上傳離線包到 mPaaS MDS 發佈服務,使用 MPNebula.startApp 方法便可。
補充:目前 H5 容器沒有使用 MPnebula.startApp(),而是直接用的內嵌形式的。如何解決?
h5Page = h5Service.createPage(this, bundle);
h5Page.getPluginManager().register(new NativeLoadingPlugin());
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
AUFrameLayout.LayoutParams.MATCH_PARENT, AUFrameLayout.LayoutParams.WRAP_CONTENT);
mContainer.addView(h5Page.getContentView(), lp);
複製代碼
答:MPNebula.updateAll
目前 mPaaS H5 容器 Demo 源碼已發佈,歡迎 Star 咱們從而進一步瞭解特性和亮點。