Nativescript firebase admob 在 ios 上第一次后未触发某些事件
Nativescript firebase admob not firing some events after the first time on ios
在我的代码中有这些函数:
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 也没有被调用。
控制台的输出顺序如下:
- 页面已加载
- 预加载奖励广告
- 奖励广告准备就绪
- 点击新卡
- 显示奖励广告
- 打开时
- onStarted
- onRewarded 调用金额为 1
- 使用 Card 类型调用 onRewarded
- 预加载奖励广告
- 关闭
- 奖励广告准备就绪
- 点击新卡
- 显示奖励广告
此时我等到广告完成。再等几秒钟以确定。我关闭广告。 10 和 11 可能看起来不正常,但这只是我 console.log 调用的位置。
- onOpened 永远不会触发。
- onStarted 永远不会触发。
- 永远不会触发 onRewarded。
- 永远不会触发 onCompleted。
- onClosed 永远不会触发。
- catch 块没有输出错误。
有什么我遗漏的吗?
我找到了一个解决方法 "good enough"。在 onClosed 事件中,我在 250 毫秒后将对 preloadRewardAd 的调用包装在 setTimeout 中。这似乎给了 ios 足够的时间来赶上。
在我的代码中有这些函数:
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 也没有被调用。
控制台的输出顺序如下:
- 页面已加载
- 预加载奖励广告
- 奖励广告准备就绪
- 点击新卡
- 显示奖励广告
- 打开时
- onStarted
- onRewarded 调用金额为 1
- 使用 Card 类型调用 onRewarded
- 预加载奖励广告
- 关闭
- 奖励广告准备就绪
- 点击新卡
- 显示奖励广告
此时我等到广告完成。再等几秒钟以确定。我关闭广告。 10 和 11 可能看起来不正常,但这只是我 console.log 调用的位置。
- onOpened 永远不会触发。
- onStarted 永远不会触发。
- 永远不会触发 onRewarded。
- 永远不会触发 onCompleted。
- onClosed 永远不会触发。
- catch 块没有输出错误。
有什么我遗漏的吗?
我找到了一个解决方法 "good enough"。在 onClosed 事件中,我在 250 毫秒后将对 preloadRewardAd 的调用包装在 setTimeout 中。这似乎给了 ios 足够的时间来赶上。