AppSeedのアプリ開発ブログ

アプリ開発会社AppSeed(アップシード)開発担当のブログです。iOS、Android、Unity、Cocos2d-xなどアプリ開発関連のTipsや備忘録、アプリ開発に役立つ情報を発信します。

AdMobのバナー広告位置を変更すると広告が表示されない場合の対処法【iOSアプリ開発】

http://picxpic.com/wp-content/uploads/2018/05/admob-1.png


日記アプリ開発中にハマった現象の対処法メモ。
現象としては、viewDidLoadのタイミングで読み込んだAdMobのバナー広告の位置を変更しようとすると、広告が表示されなくなる現象です。



viewDidLoadのタイミングでAdMobのバナー広告の位置変更はできるけど。。




画面下にツールバーを設置して、その上にAdMobのバナー広告を表示したかったので、

viewDidLoadのタイミングでバナー広告の位置変更を行ってみると、位置変更自体は正常に行えました。

ただ、viewDidLoadのタイミングではsafeAreaInsetsの値が取得できないので、

iPhoneX、iPhoneXSなどのsafeAreaを考慮したレイアウトにする必要があるデバイスで広告が変な位置に表示される状態になってしまいました。。


Apple Developer Documentation

Apple Developer Documentation



viewWillAppearのタイミングで位置変更を行うとAdMobのバナー広告が表示されない


viewWillAppearのタイミングでバナー広告の位置変更を行ってみると、AdMobバナーが表示されない状態になりました。

推測になりますが、
おそらくviewDidLoadのタイミングで広告リクエストを行って広告を読み込んでいる途中でviewWillAppearが呼ばれて広告の位置変更を行うため、
広告の読み込みが失敗かキャンセルになってしまっているんじゃないかと思われます。

あと、viewWillAppearのタイミングだとsafeAreaも取得できないので、viewWillAppearで広告の表示位置変更は行わない方がいいのかなと思います。

Apple Developer Documentation





viewDidAppearのタイミングであれば、safeAreaの値を取得しつつ、AdMobのバナー広告の位置変更ができる



最終的に、viewDidAppearのタイミングがベストだという結論に至りました。

viewDidAppearのタイミングだったら、safeAreaも取得できるし、AdMobバナー広告の位置変更を行ってもちゃんと広告が表示されます。

override func viewDidAppear(_ animated: Bool) {
        //print("safe:",(self.view.safeAreaInsets.bottom))
        //print("tool:",toolbar.frame.origin)
        toolbar.frame.origin = CGPoint(x:0, y:self.view.frame.size.height - toolbar.frame.height - (self.view.safeAreaInsets.bottom))
        if #available(iOS 11.0, *) {
            self.bannerView.frame.origin = CGPoint(x:0, y:self.view.frame.size.height - (self.view.safeAreaInsets.bottom)-self.toolbar.frame.height-self.bannerView.frame.height)
        }else{
            self.bannerView.frame.origin = CGPoint(x:0, y:self.view.frame.size.height - self.toolbar.frame.height - self.bannerView.frame.height)
        }
    }


Apple Developer Documentation


今の所、viewDidAppearのタイミングであれば正常に広告が表示されていますが、
もし表示されない場合を確認したら、広告表示位置の変更は遅延実行させようかなと思います。

挙動的に、広告ロード中に位置変更を行うからおかしくなるのかなと思うので、とりあえず対処法としてはこんな感じかなと思います。

もしより良い方法がありましたら教えて頂けると嬉しいです。