Hybrid是什么?
web app
native app
hybrid app
区别于web app和native app
jdbclient://rrc/h5rrc
scheme:jdbclient
host:rrc
path:h5rrc
虚拟域管理
hybrid://www/h5rrc
其他处理
端外打开
端内进入
native/webview
加载本地资源
调起url
H5离线包
Hybrid文件映射表
App
CDN
映射表接口
Hybrid发布平台
(编译好的静态文件)
虚拟域等处理
WebView
打开页面
方案对比
JDB
ALI 去啊
用户终端App
启动/访问webview
CDN
映射表接口
Hybrid发布平台
(编译好的静态文件)
gitlab
检查映射表更新
下载
用户终端App
启动/访问webview
CDN
映射表接口
Hybrid发布平台
(编译好的静态文件)
gitlab
检查映射表更新
下载
(懒加载)
映射表接口
file
file
...
file
file
...
md5
对比
非懒加载
请求下载新文件
更新时机
问题
CordovaPlugin
定制化Plugin1
CordovaPlugin
定制化Plugin2
CordovaPlugin
...
配置文件
config.xml
CordovaWebview
js调用组件
prompt
拦截
插件映射
注册插件
调用插件
返回结果
注册插件过程
调用插件过程
配置文件
config.xml
feature:插件参数
<?xml version='1.0' encoding='utf-8'?>
<widget
id="com.rrx.jdb"
version="0.0.1">
<preference
name="loglevel"
value="DEBUG" />
<allow-intent href="market:*" />
<name>jiedaibao</name>
<description></description>
<content src="index.html" />
<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<allow-navigation href="*" />
<feature name="PayCashier">
<param
name="android-package"
value="com.rrh.jdb.hybrid.plugin.paycashier.PayCashierPlugin"/>
</feature>
<feature name="ClearHistory">
<param
name="android-package"
value="com.rrh.jdb.hybrid.plugin.clearhistory.ClearHistoryPlugin"/>
</feature>
CordovaPlugin
定制化Plugin1
/*
* 端内插件代码
*/
public class PayCashierPlugin extends CordovaPlugin {
private CallbackContext mCallbackContext;
private LocalBroadcastManager lbm = LocalBroadcastManager
.getInstance(JDBApplication.getContext());
/** 增加operatType字段来区分打开收银台和选择银行卡界面 0为收银台 1为银行卡 */
private String OPERATE_TYPE = "operatType";
@Override
public boolean execute(String action, JSONArray jsonArray,
final CallbackContext callbackContext) {
}
@Override
public void onActivityResult(int requestCode, int resultCode,
Intent data) {
}
}
前端
cordova封装
/*
* js之cordova封装
*/
cordova.define("com.jiedaibao.paycashier.PayCashier", function (require,
exports, module) {
var exec = require('cordova/exec');
module.exports = {
payCashier : function(tradeID, amount, ext, businessType,
successCallback, errorCallback) {
exec(
successCallback,
errorCallback,
'PayCashier',
'payCashier',
[{
"tradeID": tradeID,
"amount": amount,
"ext": ext,
"businessType":businessType
}]
);
}
}
}
);
js
调用native插件
/*
* js调用插件
*/
PayCashier.payCashier(
1,
100,
'',
JSON.stringify({}),
function(ret) {
$scope.isLocked = false;
var result;
if (typeof ret == 'object') {
result = ret;
} else {
result = JSON.parse(ret);
}
if (result.status * 1 === 0) {
location.href = '#/successResult?amount=' + result.amount;
}
},
function() {
tools.toast('支付失败!!!');
$scope.isLocked = false;
}
);
/*
* js之cordova封装
*/
cordova.define("com.jiedaibao.paycashier.PayCashier", function (require,
exports, module) {
var exec = require('cordova/exec');
module.exports = {
payCashier : function(tradeID, amount, ext, businessType,
successCallback, errorCallback) {
exec(
successCallback,
errorCallback,
'PayCashier',
'payCashier',
[{
"tradeID": tradeID,
"amount": amount,
"ext": ext,
"businessType":businessType
}]
);
}
}
}
);
/*
* 端内插件代码
*/
public class PayCashierPlugin extends CordovaPlugin {
private CallbackContext mCallbackContext;
private LocalBroadcastManager lbm = LocalBroadcastManager
.getInstance(JDBApplication.getContext());
/** 增加operatType字段来区分打开收银台和选择银行卡界面 0为收银台 1为银行卡 */
private String OPERATE_TYPE = "operatType";
@Override
public boolean execute(String action, JSONArray jsonArray,
final CallbackContext callbackContext) {
}
@Override
public void onActivityResult(int requestCode, int resultCode,
Intent data) {
}
}
整个对象
客户端
人人催按钮
RouteManager
jdbclient://rrc/h5rrc
HybridBaseActivity(端处理)
moduleName->h5rrc
HybridBaseActivity
(h5处理)
我是启动页