H5+ App,HTML5 Plus移动App,简称5+App,是一种基于HTML、JS、CSS编写的运行于手机端的App
本文档概述如何在H5+ App中接入版署审核 SDK
v16.16.0本文档使用的HBuilderX版本为
3.7.3,非此版本注意兼容性问题
本文档中使用的Android
编译工具及依赖都是最新,游戏不必如此
在 DCloud开发者中心 注册自己的应用,提交
应用注册后将得到app id,
app key这在接下来的打包中需要
在 4399 开发者平台
注册游戏,成功后将得到 game key ——游戏在4399平台的标识
建议大致了解官方教程: Android
原生工程配置 ,再对比H5+
App 4399版署审核 SDK 示例(以下称“示例”) 实际操作 注意:
示例的app/libs需要单独下载(见下文),app/src/main/assets无游戏资源
下载好示例解压后,看到的主要内容有
app # Android 应用模块,最终打包成APK
operateBZ-phx # 插件模块,接入SDK并将按H5+协议封装为插件,为app模块依赖
h5plusSample # H5+ app 示例,游戏项目按以下步骤尝试初次打包:
h5plusSample/manifest.json,主要是app idunpackage目录app,将h5plusSample/unpackage拷贝到app/src/main/assets目录app/src/main/assets/data/dcloud_control.xml配置app idapp/src/mainAndroidManifest.xml中添加app key完成以上步骤后,可以直接运行项目,通过真机调试,若游戏正常游戏即可进行后续步骤
H5+App 在 Android
平台接入第三方SDK,需要先按照协议将其封装为js接口,示例中为operateBZ-phx模块
operateBZ-phx插件模块,此模块对插件的依赖方式为编译期依赖cn.m4399.operateBZ.phx.OperateCenterPHX类的封装方式,注意其中的参数传递方式本示例工程没有打包app/libs下的依赖,这部分内容单独上传到了h5+ app
3.7.3目录
app/src/main/assets/dcloud_properties.xml中内容properties.features节点下新增
<!-- 4399 OperateBZ PHX plugin -->
<feature name="OperatePHX" value="cn.m4399.operateBZ.phx.OperateCenterPHX" />manifest.json注册插件permissions节点下新镇
"OperatePHX" : {
"description" : "4399 版署审核 SDK Phaser HBuilderX封装"
}window对象中注入插件实例,参考src/sdk/operateBZPHX.js中内容在游戏中调用js接口前,先简要说明 android 接口到 js
接口的封装方式,以iniSDK接口为例
io.dcloud.common.DHInterface.StandardFeatureinitSDK从游戏或js中接收的参数值在optsions中,且第一个参数为回调对象public void initSDK(IWebview iWebview, JSONArray options);initSDK方法实现中,先提取 js 参数,然后正常调用 android
接口operateBZPHX.js中的wrapJsCallback所示提示:mockOpeBZPHX.js是模拟对象,可以在浏览器中模拟数据,直接测试游戏调用
提示:示例游戏中的调用,只是示意在此特定游戏环境下的调用时机,部分逻辑并不完善
初始化/读取存档, src/App.vue
let localUser; // 读取游戏自身登录状态,可选操作
// 初始化
createOperatePHX().then(opePHX => {
opePHX.initSDK('40027', 0, true,
({event, isLogin, user}) => {
switch (event) {
case 'init_finished': // 初始化完成
if (!localUser.username) {
if (isLogin) {
let newUser = {id: user.uid, username: user.name,};
this.addUser(newUser);
opePHX.readArchive(({data: role}) => { // 读取存档
if (role?.length)
newUser.role = role;
// todo: 读取存档,更新角色信息
})
}
}
break;
case 'account_logout': // 账号登出
this.addUser({})
break;
case 'account_switch': // 账号切换
break;
default:
}
this.$router.push({name: "userInfo"})
});
});登录/读取存档、登出、充值, src/UserInfo.vue
// 登录
login() {
this.invokeOpePHX(opePHX => {
opePHX.isLogin(({isLogin}) => {
if (isLogin) {
// SDK 初始化后已经有登录状态,不需要在登录,可以直接获取用户信息
} else {
opePHX.login(({success, resultCode, user}) => {
if (success) {
this.user = {id: user.uid, username: user.name};
opePHX.readArchive(({data: role}) => { // 读取存档
// todo: 处理登录结果
// todo: 读取存档,更新角色信息
this.addUser(this.user)
})
} else {
// 登录失败
}
})
}
})
});
},
// 登出
logout() {
this.user = {id: '', username: ''}
this.invokeOpePHX(opePHX => {
opePHX.logout();
// 清除游戏内登录状态
});
},
// 充值
recharge() {
this.invokeOpePHX(opePHX => {
let money = 10;
let commodity = `${money * 10} 金币`
let mark = `cid_xx|uid_xx|${Date.now()}`;
opePHX.recharge(money, mark, commodity, false,
({success, resultCode, message}) => {
// todo: 游戏充值,处理充值结果
if (success) {
// 充值成功,游戏根据服务端回调发放物品
} else
// 充值失败
});
})
},
invokeOpePHX(callback) {
createOperatePHX()
.then(opePHX => {
callback(opePHX);
})
.catch(e => {
this.$message({content: `错误: ${e.toString()}`})
})
}