AdMobのリワード広告を利用して、UnityアプリからGoogle Driveへのインポート・エクスポート処理を行うケースがあると思います。
例えば:
- リワード動画を見たあとにバックアップデータをDriveに保存
- 広告報酬として設定データをDriveから復元可能にする
といった設計です。
このような構成はよく使われますが、処理タイミングを誤るとエラーが発生しやすいので注意が必要です。
問題となる構成
以下のような処理フローを組んだ場合、タイミングによってはGoogle Drive処理が失敗することがあります:
AdMobリワード広告表示
↓
OnUserEarnedReward イベント内で即座に Google Drive処理開始
このように広告報酬確定の直後にDrive処理を即実行すると、
- Context(Activity)が不安定
- UIスレッドが切り替わり中
- 非同期認証が未完了
などの理由で、ファイル選択ダイアログが出ない・クラッシュするなどの不具合が発生します。
解決策:タイミングを分離する
一番安全な方法は、
「リワード確定」→「処理許可フラグを立てる」→「ユーザーが任意タイミングでDrive処理を実行する」
という流れをとることです。
void OnUserEarnedReward(...) {
canExecuteDriveOperation = true;
}
// UIボタンで実行
void OnClickDriveImport() {
if (!canExecuteDriveOperation) return;
StartDriveImport();
canExecuteDriveOperation = false;
}
これにより、処理のタイミングをユーザーの操作に委ねることができ、
ネイティブレベルの競合や非同期エラーを回避できます。
また、広告の終了検知イベント(OnUnityAdsDidFinishやOnAdClosedなど)を使ってDrive処理を開始することも可能です。
この場合もリワード報酬の確定とは別で、処理を明示的に開始できるので安定性が増します。
void HandleAdClosed() {
StartDriveExport();
}
この方法であればユーザー操作なしでもDrive処理をスムーズに繋げることができます。
ただし、広告終了から処理開始までワンクッション時間を置くとより安全です。
よくあるエラー例
ActivityNotFoundException
:ファイルピッカーが起動できないNullPointerException
:Intent送信対象がnull- Drive処理が始まらず、アプリが固まる
これらはすべて「処理タイミング」が原因のことが多いです。
まとめ
AdMobのリワード広告とGoogle Drive連携は、便利な構成ですが処理開始のタイミングが非常に重要です。
- イベント内で即Drive処理は避ける
- フラグを立ててUI経由で処理を実行させる
- または広告終了時のイベントを活用し、ワンクッション入れてからDrive処理を実行
といった工夫で安定性を確保しましょう。
ブログでもUnityや個人開発ネタを発信中です!
開発ノウハウやアプリ制作過程、Unity連携系のハマりポイントなど
より深掘りした内容をブログにまとめています。
▶ https://syunpp.com
公開中のアプリ一覧はこちら!
実際にUnityで開発してリリース済みのアプリ一覧をまとめています。
▶ https://syunpp.com/公開中のアプリ一覧/
コメント