在我的代码中,我具有以下功能:
const preloadRewardAd = function() {
console.log('preload reward ad');
firebase.admob.preloadRewardedVideoAd({
iosAdPlacementId: 'xxx',
androidAdPlacementId: 'yyy',
testing: config.adMobTesting,
iosTestDeviceIds: config.iosTestDeviceIds
}).then(
function() {
console.log('reward ad ready');
}
);
};
const showRewardAd = function(card: Card) {
console.log('show reward ad');
return firebase.admob.showRewardedVideoAd({
onRewarded: (reward) => {
console.log('onRewarded called with amount ' + reward.amount);
console.log('onRewarded called with type ' + reward.type);
card.fetch().then(() => {
card.notifyPropertyChange('id', card.id);
});
},
onOpened: () => console.log('onOpened'),
onClosed: () => {
preloadRewardAd();
console.log('onClosed');
},
onStarted: () => console.log('onStarted'),
onCompleted: () => console.log('onCompleted'),
onLeftApplication: () => console.log('onLeftApplication')
}).catch(err => {
console.log(err);
});
};
export function newCard(args: EventData) {
console.log('tap new card');
const pager = <Pager>page.getViewById('cards-carousel');
const card = <Card>pager.get('items').getItem(pager.selectedIndex);
showRewardAd(card);
}
然后我在page.loaded中调用preLoadRewardAd()。
[在Android上可以正常使用:当用户关闭广告时,它会预加载下一个广告。
在ios上,它可以在第一个广告显示上正常运行。但是在第二个广告中,永远不会调用onRewarded,即使onClosed被调用,它也不会预加载另一则广告,整个过程都分崩离析。也不会调用onCompleted。
这是控制台的输出顺序:
此时,我等待广告完成。等待几秒钟以确保。我关闭了广告。 10和11可能看起来不正常,但这只是我console.log调用的位置。
我缺少什么吗?
我发现了一种“足够好”的解决方法。在onClosed事件中,我在250ms之后将对preloadRewardAd的调用包装在setTimeout中。这似乎给了ios足够的时间来追赶。