一、平台介绍
OPPO小游戏运行在OPPO手机自带的游戏中心,活跃用户接近一亿,目前小游戏产品接入需要商务审核,审核通过后方可上线。
平台地址请自行搜索,优快云这里不让发出来。
二、问题记录
(更新于2021年7月)
1、文件系统API,处理一个不存在的目录,没有回调fail方法【platformVersion: 1090 必现】
oppoFS.stat({
path: 'qgfile://usr/temp_game',
success: function (res) {
console.log(1,res);
},
fail: function () {
console.log(res);
}
})
2、文件系统API,oppoFS.readdirSync() 访问一个正常存在的目录,也是返回undefined 【platformVersion: 1090 必现】
3、文件系统API,oppoFS.rmdirSync(‘qgfile://usr/temp_game’, true); 移除一个正常存在的目录报错,提示 no such file or directory,这个目录通过oppoFS.stat方法能正常回调success 【偶现】
4、oppo账号登录请求userinfo概率性失败
请求接口是:https://play.open.oppomobile.com/instant-game-open/userInfo?pkgName=xxxx;
使用qg.loin返回最新的token进行请求,报1005错误,提示“认证失败,token校验失败”,【偶现,大概0.1-4%的错误率】
5、代码日志里面偶现部分用户连引擎代码都读取失败,可能是底层代码注入的错误,需要等待平台修复
6、文件系统目前只支持50M存储空间,不像微信、vivo等平台开放到200M。但是有内部未公开方法实现提升。
7、插屏广告不再开放,开发者可以通过自渲染原生广告的方式间接实现。
8、使用quickgame工具打包,项目文件夹下的所有文件都会打包在zip游戏包里面,如果想自己过滤一些不必要的文件,可以修改打包文件signer.js(存储在安装目录下这个路径 quickgame-toolkit\lib\sign\signer.js),在parse方法里面添加代码
if(file.indexOf(".bat")>-1 || file.indexOf(".php")>-1) return;
修改之后的完整 signer.js 文件如下
var fs = require( 'fs-extra');
var path = require( 'path');
var jszip = require( 'jszip');
var signer = require( './bundle');
var EXCLUDES = require( '../config/config').EXCLUDES;
var COMPRESS_OPTS = {
type: 'nodebuffer',
compression: 'DEFLATE',
compressionOptions: {
level: 9
}
}
exports.sign = (options, isDev, callback) => {
const privatekey = fs.readFileSync(options.signFiles.privatekey)
const certpem = fs.readFileSync(options.signFiles.certificate)
const zipper = new jszip()
const filehashs = []
const zipfile = path.join(options.output,options.rpkName+'.zip')
let signfile = path.join(options.output, options.rpkName)
if (isDev || process.env.NODE_ENV != 'production') {//如果强制写了isDev,不打signed
signfile += '.rpk'
}else{
signfile += '.signed.rpk'
}
parse(options.input, '.', (name, file) => {
if(file.indexOf(".bat")>-1 || file.indexOf(".cmd")>-1 || file.indexOf(".php")>-1)
return; //添加的自定义代码
if (name.substr(0, 5) !== 'dist/' && name.substr(0, 5) !== 'sign/' && EXCLUDES.indexOf(name) === -1) {
console.log('name include', name)
// 文件列表hash
filehashs.push({
name: Buffer.from(name),
file: file,
hash: signer.hashFile(file, fs)
})
zipper.file(name, fs.createReadStream(file));
}
}, fs)
fs.ensureDirSync(options.output)
zipper.generateNodeStream(COMPRESS_OPTS).pipe(fs.createWriteStream(zipfile)).on('finish', function() {
signer.signZip({
zip: zipfile,
files: filehashs
}, privatekey, certpem, signfile)
// 删除临时文件
fs.existsSync(zipfile) && fs.unlinkSync(zipfile)
//console.log(chalk.green(`签名完成!文件为:${signfile}`))
callback && callback(signfile)
})
}
var parse = (base, dir, cb, fs) => {
dir = dir || '.'
const directory = path.posix.join(base, dir)
let name
// 递归遍历目录
fs.readdirSync(directory).forEach(function(file) {
const fullpath = path.posix.join(directory, file)
const stat = fs.statSync(fullpath)
if (stat.isFile()) {
// 替换
const posixdir = dir.split(path.sep).join(path.posix.sep)
name = path.posix.join(posixdir, path.basename(file))
cb(name, fullpath)
} else if (stat.isDirectory()) {
const subdir = path.posix.join(dir, file)
parse(base, subdir, cb, fs)
}
})
}
----------------------华丽的分割线----------------------------------------------------------------------
(截止到2020年3月)
1、oppo编译 需要先安装 quickgame(可以从网上下载 ,也可以从 egret 自动下载的 目录)
oppo文档地址见这里
2、oppo 调用 quickgame -v 报错:primordials is not defined, 原因是 node版本太高(12.13.1),和gulp版本不一致,把nodejs降到 11.9.0 就好了
3、egret引擎:oppo 看完视频,会触发 egret.stage resize事件(微信等其他平台不会),故如果侦听了resize事件,需要注意测试
4、egret引擎:oppo 看完视频回调需要延时 显示 tips(显示对象) 否则显示不出来
5、oppo banner 有不少问题,需要详细测试(2019.12.12)
6、oppo 2.9版本(1050)平台及更低版本以下无需兼容和测试(技术同学说的)
7、oppo 不支持游戏跳转、版本更新提示(没有更新的api)
8、oppo 游戏内的跳转ico不允许与真实游戏ico不一致,这类诱导行为一经发现游戏下架