忍者ブログ
  • 2024.10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 2024.12
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2024/11/22 13:42 】 |
アドフリ君実装感
なぜか広告がいつまでも取得されない(AdsFetchCompletedがいつまでも呼び出されない)という現象。
どうやらライブラリの追加もれがあったようだ。
コンパイルエラーとかリンクエラーとか起きないこともあるのか。
沈黙の臓器。

全部直したらちゃんと取得された。


次の問題。
maioが再生できない。
エラーとして以下のようなものが出た

UIAlertControllerに動画ビューを載せようとしているようだ。
なぜそんなことをするのか。
確かに、再生命令の直前までアラートを出している(アラートで「はい」を選択したら動画を再生している)
それのせいなのか。
その時点で最前面にあるコントローラに載せて再生しようとしているのか。

アラートから直接でなく、アラートの直後(0コンマ数秒後)に再生するように変えてみた。
まだダメだ。同じワーニングが出る。
まだUIAlertControllerのインスタンスが残っているからか。

アラートを出さずに再生してみた。
問題なく再生された。

うーむ。再生するビューコントローラを指定できないのか?

adfurikun自体のメソッド(ADFMovieReward.framework)には、再生するときにビューコントローラを指定する方法がない。
しかしmaioにはあったはずだ。以下の2種類の指定ができる。
[Maio show];
[Maio showWithViewController:viewController];
そこで、adfurikunからmaioを呼び出す部分を見てみる。
MovieReward6004.h/m だ。
見てみると、確かに

-(void)showAd
{
if ([Maio canShow]) {
[Maio show];
}
}



とだけ書いて有る。

そんなら、こっちから指定できるようにしちゃおう、ということで

MovieReward6004.h

@interface MovieReward6004 : ADFmyMovieRewardInterface

+(void) setViewController:(UIViewController*)vc;

@end




MovieReward6004.m

@implementation MovieReward6004

static UIViewController* viewController;

+(void) setViewController:(UIViewController*)vc{
viewController = vc;
}


:
:


-(void)showAd
{
if ([Maio canShow]) {
if (viewController) {
[Maio showWithViewController:viewController];
}
else{
[Maio show];
}
}
}





という感じで追記してみた。

で、adfurikunの初期化のときに

[MovieReward6004 setViewController:self.viewController];



を追加。


ビルドして実行してみると…いい感じ!
アラートがあってもちゃんと再生された!


というわけで、maioは解決。

だが…ほかの広告も対応が必要になってくると面倒。

vungleで試したが、こちらは指定がviewやviewControllerでなく、windowになっている。
同じ要領で
[UIApplication shareApplication].keyWindow
を渡そうとしたが、なぜか実行時に盛大に落ちる。

面倒になってきたので、
「アラートと一緒にadfurikunは再生しない」
というのが現状の結論。



#######################

別件。

アドフリ君には、以下の2つのdelegateが用意されている(他にもあるが)
AdsDidCompleteShow
AdsDidHide
動画の再生が終了した時と、動画を閉じた時だ。

動画広告は通常、動画が流れ終わると静止画になって、ダウンロードページに行くか、広告を閉じるボタンかを選ぶ。
静止画になった時に呼ばれるのがAdsDidCompleteShow、広告を閉じたらAdsDidHideが呼ばれるべきだ。

だが、必ずしもそうなってない。
検証した。

広告種類AdsDidCompleteShowAdsDidHide
appLovin再生終わった時広告閉じた時
maio再生終わった時広告閉じた時
adColony広告閉じた時広告閉じた時
vungle広告閉じた時広告閉じた時
UnityAds未確認未確認

ということだ。
appLovinとmaio優秀。
adColonyとvungleトラップ。

元のSDKに対応するコールバックがないのかもしれないが、通知タイミングが名前と違うのは罠だ。

本来、インセンティブを付与するのはAdsDidCompleteShow
ゲームを再開する処理はAdsDidHide
と別々になっているべきだ。


adColonyとvungleなんかは、コールバックの名前を信じて実装してると、
広告を閉じないとインセンティブがもらえなくなる。

これがどういう問題かというと、
広告を見て、ユーザがその広告先に遷移し、そのままゲームアプリがメモリから消えてしまうと、広告を見たのにインセンティブがもらえない、ということが起きてしまう。

これはクレームがついても仕方がない。
対応したほうが良いだろう。

方法として考えられるのは
・その広告を使わない
・広告再生中にアプリがバックグラウンドに行ったら、付与する
・再生開始時にもうインセンティブ付与しちゃう
・ストック型のインセンティブにしない(本末転倒)
などなど…
PR
【2016/02/01 15:13 】 | 広告 | 有り難いご意見(0)
| ホーム |