是否在 React Native 中观看了奖励广告

Has the rewarded ad been watched in React Native

我在我的 React Native 应用程序中使用 Firebase AdMob,当用户点击特殊按钮时,应该会显示一个奖励广告单元。这个按钮组件和调用广告横幅的功能是在单独的文件中实现的。因此,我的函数需要 return 一个值来显示用户是否观看了完整的广告并获得了奖励。但是我不知道如何在 rewarded.onAdEvent 事件以 type === RewardedAdEventType.EARNED_REWARD 结束后 return 值。有一个调用广告和按钮组件的函数示例:

Ads.js片段

const showRewarded = () => {
    const rewarded = RewardedAd.createForAdRequest(UNIT_ID, {
      requestNonPersonalizedAdsOnly: false,
    });
    const eventListener = rewarded.onAdEvent((type, error, reward) => {
      if(type === RewardedAdEventType.LOADED) {
        rewarded.show();
      }
      if(type === RewardedAdEventType.EARNED_REWARD) {
        return reward;
      }
      // The reward should be null if user skiped the ad
      return null; 
    }); 
    rewarded.load();
    // Wait for event completion
  }

Button.js

import React from 'react';
import {
  View,
  Text,
  TouchableOpacity
} from 'react-native';;
import { Ads } from '../components';

class MyButton extends React.Component {

  constructor(props) {
    super(props);
  }

  showAd() {
    // Wait while user has not been get a reward (or skiped the ad)
    const reward = Ads.showRewarded();
    console.log(`The reward is ${reward}`);
  }

  render() {

    return (
      <View>
      <TouchableOpacity onPress={() => this.showAd()}>
        <Text>Show Ad to get a reward</Text>
      </TouchableOpacity>
      </View>
    )
  }
}

export default MyButton;

我认为有更好的解决方案,但我是在广告单元尚未加载时使用简单的 setTimeout 函数完成的。它看起来像这样:

const showRewarded = async () => {
    const rewarded = RewardedAd.createForAdRequest(UNIT_ID, {
      requestNonPersonalizedAdsOnly: false
    });
    var loaded = false;
    var gotReward = false;
    const eventListener = rewarded.onAdEvent((type, error, reward) => {
      if(type === RewardedAdEventType.LOADED) {
        rewarded.show();
        loaded = true;
      }
      else if(type === RewardedAdEventType.EARNED_REWARD) {
        gotReward = true;
      }
      else if(error) {
        console.warn(error);
      }
    }); 
    rewarded.load();
    while(!loaded) {
      await new Promise((resolve, reject) => setTimeout(resolve, 1000));
    }
    return gotReward;
  }

此功能return gotReward 仅在广告关闭后。如果用户观看了所有广告则为真,如果他已跳过则此值为假。