Closed shuizhongyueming closed 4 years ago
找到问题了,我这边用的白鹭引擎,可能版本有点旧吧,里面有一个Box2dweb的库,里面针对Object.defineProperty
有一个polyfill:
if(!(Object.prototype.defineProperty instanceof Function)
&& Object.prototype.__defineGetter__ instanceof Function
&& Object.prototype.__defineSetter__ instanceof Function)
{
Object.defineProperty = function(obj, p, cfg) {
if(cfg.get instanceof Function)
obj.__defineGetter__(p, cfg.get);
if(cfg.set instanceof Function)
obj.__defineSetter__(p, cfg.set);
}
}
但是小游戏平台下Function
被改写过,用instanceof Function
来判断是否为函数肯定是会失败的,这就导致这个polyfill会让Object.defineProperty
里面的get
和set
失效。
然后我看了下广告在vivo里面的内部实现,在继承这块,是有用到Object.defineProperty
function i(e, t) {
for (const a of Reflect.ownKeys(t))
if ("constructor" !== a && "prototype" !== a && "name" !== a) {
const r = Object.getOwnPropertyDescriptor(t, a);
Object.defineProperty(e, a, r)
}
}
t.mix = function(...e) {
class t {
constructor(...t) {
i(this, new e[0](...t))
}
}
for (const a of e)
i(t, a),
i(t.prototype, a.prototype);
return t
}
因为Object.defineProperty
的异变,使得最终创建的bannerAd
里面会丢失moduleName
等属性,在调用show
方法的时候才会诡异的出现"undefined创建次数或者创建频率过高"
,正常情况下,如果是频率过高,是会提示具体哪个广告模块的。
我这边把对Object.defineProperty
的polyfill注释之后,再运行游戏,广告就能正确展示了😃
相关信息
引擎
平台版本号:1063 平台版本名称:1.6.3.303
手机型号
vivo Z5X
操作系统
IDE版本
toolkit版本
问题描述
创建广告,bannerAd, interstitialAd或者rewardedVideoAd没问题,但是调用show,会catch到错误:
{"data":{"errCode":30009,"errMsg":"undefined创建次数或者创建频率过高"},"code":30009}
查看了官网的广告错误码信息
但是我这边是游戏启动之后,第一次调用,也是会这样,所以跟我这边的调用频率应该没有关系
复现步骤
使用的官方DEMO
在游戏启动之后,等待十秒执行