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 也没有被调用。

控制台的输出顺序如下:

  1. 页面已加载
  2. 预加载奖励广告
  3. 奖励广告准备就绪
  4. 点击新卡
  5. 显示奖励广告
  6. 打开时
  7. onStarted
  8. onRewarded 调用金额为 1
  9. 使用 Card 类型调用 onRewarded
  10. 预加载奖励广告
  11. 关闭
  12. 奖励广告准备就绪
  13. 点击新卡
  14. 显示奖励广告

此时我等到广告完成。再等几秒钟以确定。我关闭广告。 10 和 11 可能看起来不正常,但这只是我 console.log 调用的位置。

有什么我遗漏的吗?

我找到了一个解决方法 "good enough"。在 onClosed 事件中,我在 250 毫秒后将对 preloadRewardAd 的调用包装在 setTimeout 中。这似乎给了 ios 足够的时间来赶上。