Объявление Admob с вознаграждением показывается только один раз.Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Объявление Admob с вознаграждением показывается только один раз.

Сообщение Anonymous »

Я создаю приложение, используя React Native expo. Я пытаюсь реализовать рекламу с вознаграждением. Я скопировал код из документации, и он работает. В моем приложении пользователи могут смотреть столько рекламы, сколько захотят, чтобы заработать игровые монеты. Проблема в моей реализации: объявление с вознаграждением можно увидеть только один раз, и если пользователь попытается посмотреть еще одно объявление, он увидит ошибку:

Ошибка. : RewardedAd.show() Запрошенное RewardedAd не загружено и
не может быть показано.

Эта реализация находится в модальном режиме. Поэтому, если я закрою модальное окно, открою его и нажму кнопку, чтобы снова посмотреть рекламу с вознаграждением, оно сработает. Поскольку это не очень удобно для пользователя, рекламу следует видеть даже без закрытия модального окна. Буду очень рад, если будет чем исправить эту проблему.
Вот моя реализация:
import { useEffect, useState } from "react";
import {
RewardedAd,
RewardedAdEventType,
TestIds,
} from "react-native-google-mobile-ads";

const adUnitId = __DEV__
? TestIds.REWARDED
: "ca-app-pub-xxxxxxxxxxxxx/yyyyyyyyyyyyyy";

const rewarded = RewardedAd.createForAdRequest(adUnitId);

export const useRewardedAd = () => {
const [loaded, setLoaded] = useState(false);

const watchAd = () => {
if (loaded) {
rewarded.show();
}
};

useEffect(() => {
const unsubscribeLoaded = rewarded.addAdEventListener(
RewardedAdEventType.LOADED,
() => {
setLoaded(true);
}
);
const unsubscribeEarned = rewarded.addAdEventListener(
RewardedAdEventType.EARNED_REWARD,
(reward) => {
console.log("User earned reward of ", reward);
}
);

// Start loading the rewarded ad straight away
rewarded.load();

// Unsubscribe from events on unmount
return () => {
unsubscribeLoaded();
unsubscribeEarned();
};
}, []);

// No advert ready to show yet
if (!loaded) {
return null;
}

return watchAd;
};

В этом компоненте я использую watchAd:
import { View, Text, Alert } from "react-native";
import React, { useContext } from "react";
import { Entypo, FontAwesome, FontAwesome5 } from "@expo/vector-icons";
import EarnRow from "./EarnRow/EarnRow";
import { PlayerInformationContext } from "@/context/PlayerInformation";
import { useRewardedAd } from "@/hooks/useRewardedAd/useRewardedAd";

const Earn = () => {
const watchAd = useRewardedAd();

const {
money,
seenAdsCount,
health,
setHealth,
setMoney,
handleSeenAdsCount,
} = useContext(PlayerInformationContext);
const handleEarn = async (type: string) => {
switch (type) {
case "getMoney":
if (seenAdsCount < 10) {
handleSeenAdsCount(seenAdsCount + 1);
}
if (watchAd) {
watchAd();
}
break;
case "getHealth":
if (money >= 100) {
setHealth(health + 12);
setMoney(money - 100);
Alert.alert("Enerji Topladın!", "12 enerji puanı kazandın!");
} else {
Alert.alert("Yetersiz Altın!", "Bu işlem için yeterli altının yok.");
}
break;

default:
break;
}
};

return (


Kazan


handleEarn("getMoney")}
buttonIcon={}
/>

handleEarn("getHealth")}
buttonIcon={

}
/>

);
};

export default Earn;


Подробнее здесь: https://stackoverflow.com/questions/792 ... -only-once
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»