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 id
unpackage
目录app
,将h5plusSample/unpackage
拷贝到app/src/main/assets
目录app/src/main/assets/data/dcloud_control.xml
配置app id
app/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.StandardFeature
initSDK
从游戏或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 => {
.initSDK('40027', 0, true,
opePHXevent, isLogin, user}) => {
({switch (event) {
case 'init_finished': // 初始化完成
if (!localUser.username) {
if (isLogin) {
let newUser = {id: user.uid, username: user.name,};
this.addUser(newUser);
.readArchive(({data: role}) => { // 读取存档
opePHXif (role?.length)
.role = role;
newUser// 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 => {
.isLogin(({isLogin}) => {
opePHXif (isLogin) {
// SDK 初始化后已经有登录状态,不需要在登录,可以直接获取用户信息
else {
} .login(({success, resultCode, user}) => {
opePHXif (success) {
this.user = {id: user.uid, username: user.name};
.readArchive(({data: role}) => { // 读取存档
opePHX// todo: 处理登录结果
// todo: 读取存档,更新角色信息
this.addUser(this.user)
})else {
} // 登录失败
}
})
}
});
}),
}
// 登出
logout() {
this.user = {id: '', username: ''}
this.invokeOpePHX(opePHX => {
.logout();
opePHX// 清除游戏内登录状态
;
}),
}
// 充值
recharge() {
this.invokeOpePHX(opePHX => {
let money = 10;
let commodity = `${money * 10} 金币`
let mark = `cid_xx|uid_xx|${Date.now()}`;
.recharge(money, mark, commodity, false,
opePHX, resultCode, message}) => {
({success// todo: 游戏充值,处理充值结果
if (success) {
// 充值成功,游戏根据服务端回调发放物品
else
} // 充值失败
;
})
}),
}
invokeOpePHX(callback) {
createOperatePHX()
.then(opePHX => {
callback(opePHX);
}).catch(e => {
this.$message({content: `错误: ${e.toString()}`})
}) }