質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
AdMob

AdMobは、事前に指定した条件に従ってアプリに広告を表示するGoogleのサービス。開発者の向けのサービスで、広告を掲載することにより、収益を得ることが可能です。その他、見た目や雰囲気などアプリに合う広告に変更したり、広告表示の場所を指定することもできます。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

2回答

2515閲覧

AdMobのインターステイシャル広告を事前にロードし遷移後すぐ表示する

lyzmfeqpxs54

総合スコア237

AdMob

AdMobは、事前に指定した条件に従ってアプリに広告を表示するGoogleのサービス。開発者の向けのサービスで、広告を掲載することにより、収益を得ることが可能です。その他、見た目や雰囲気などアプリに合う広告に変更したり、広告表示の場所を指定することもできます。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/08/17 01:32

いつもお世話になっております。

現在アプリにインターステイシャル広告を導入してるのですが、google adsense側から広告の停止警告がきてしまいました。調べてみると、広告の表示が、画面遷移後少ししてから表示しているのことが問題になりそうだったため、アプリ起動中に広告のロードを行い、最初の画面が表示されるとともにすぐに広告が表示できるようにしたいと考えていおります。

現在以下のようにコーディングしているのですが、この状態ですと、この画面で読み込みを開始するため、表示が遅くなってしまいます。アプリ起動時に読み込むために、GADRewardBasedVideoAd.sharedInstance()による広告の読み込みをappdelegateなどに記載し、読み込み完了まで、最初のviewコントローラーに遷移しないようにするためにはどのようにすればよいのでしょうか。

不勉強で申し訳ございませんが、ご回答いただけますと幸いです。
よろしくお願いいたします。

Swift

1//AdMob管理画面から確認できるユニットIDを設定 2 let AdMobID = "本番ID" 3 let TEST_DEVICE_ID = "テストID" 4 5 let AdMobTest:Bool = true 6 let SimulatorTest:Bool = false 7 var AdUnitID:String? = nil 8 let simulation = true 9 // Is an ad being loaded. 10 var adRequestInProgress = false 11 var adRedy = false 12 // The reward-based video ad. 13 var rewardBasedVideo: GADRewardBasedVideoAd? 14 var statusLabel: UILabel! 15 16override func viewDidLoad() { 17 super.viewDidLoad() 18    statusLabel = UILabel() 19 rewardBasedVideo = GADRewardBasedVideoAd.sharedInstance() 20 rewardBasedVideo?.delegate = self 21 22 setupRewardBasedVideoAd() 23} 24 25func playAd() { 26 print("adRedy=(adRedy)") 27 28 if GADRewardBasedVideoAd.sharedInstance().isReady && adRedy{ 29 GADRewardBasedVideoAd.sharedInstance().present(fromRootViewController: self) 30 adRedy = false 31 } 32 else{ 33 print("Error: Reward based video not ready") 34 } 35 } 36 func setupRewardBasedVideoAd() { 37 statusLabel.text = "set up" 38 39 if !adRequestInProgress && rewardBasedVideo?.isReady == false { 40 rewardBasedVideo?.load(GADRequest(), 41 withAdUnitID: TEST_DEVICE_ID ) 42 43 adRequestInProgress = true 44 } 45 else{ 46 print("Error: setup RewardBasedVideoAd") 47 } 48 } 49 50 func rewardBasedVideoAd(_ rewardBasedVideoAd: GADRewardBasedVideoAd, 51 didFailToLoadWithError error: Error) { 52 adRequestInProgress = false 53 statusLabel.text = "failed to load" 54 55 print("Reward based video ad failed to load: (error.localizedDescription)") 56 } 57 58 func rewardBasedVideoAdDidReceive(_ rewardBasedVideoAd: GADRewardBasedVideoAd) { 59 statusLabel.text = "ad is received" 60 adRequestInProgress = false 61 adRedy = true 62 63 print("Reward based video ad is received.") 64 playAd() 65 } 66 67 func rewardBasedVideoAdDidOpen(_ rewardBasedVideoAd: GADRewardBasedVideoAd) { 68 statusLabel.text = "Opened reward based video ad." 69 70 print("Opened reward based video ad.") 71 } 72 73 func rewardBasedVideoAdDidStartPlaying(_ rewardBasedVideoAd: GADRewardBasedVideoAd) { 74 print("started playing.") 75 } 76 77 func rewardBasedVideoAdDidClose(_ rewardBasedVideoAd: GADRewardBasedVideoAd) { 78 statusLabel.text = "ad is closed" 79 setupRewardBasedVideoAd() 80 81 print("Reward based video ad is closed.") 82 } 83 84 func rewardBasedVideoAdWillLeaveApplication(_ rewardBasedVideoAd: GADRewardBasedVideoAd) { 85 86 print("Reward based video ad will leave application.") 87 } 88 89 func rewardBasedVideoAd(_ rewardBasedVideoAd: GADRewardBasedVideoAd, 90 didRewardUserWith reward: GADAdReward) { 91 print("Reward received with currency: (reward.type), amount (reward.amount).") 92 } 93

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aja

2018/08/17 01:51

「最初の画面が表示されるとともにすぐに広告が表示できるようにしたい」むしろこの方法が警告されるのではありませんでしょうか?
aja

2018/08/17 02:01

表示頻度が多すぎるとか、実際にどういう警告が来たのでしょう?
lyzmfeqpxs54

2018/08/17 02:06 編集

早速のご返答ありがとうございます。来たメールは以下の通りです。調べてみると閲覧中に出てきてしまうことが原因と思ったのですが…。 現在、お客様のアプリは AdMob プログラム ポリシーに違反しています。広告配信が中断されないようにするには、お客様に対応していただく必要があります。必要な対応について詳しくは、以下の説明をご覧ください。 パブリッシャー ID: XXX アプリ ID: XXXXX 現在の広告配信ステータス: 有効 違反に関する説明 偶発的クリックを誘導するレイアウト - インタースティシャル広告 アプリ開発者様が AdMob インタースティシャル広告のクリックを誘発するような行為は、いかなる方法であっても許可されていません。どのようにインタースティシャル広告を導入しているかご確認いただき、次に示すようなポリシーに準拠していない広告の掲載例にご注意ください。 ユーザーがアプリのコンテンツを閲覧している最中に予期せず読み込まれるインタースティシャル広告。
guest

回答2

0

禁止事項を確認したところ、アプリ起動と同時に広告を表示することは禁止事項のようです。
おすすめの修正方法を見ると、「読み込み中」であることを示す画面を間にはさめば良いそうです。

禁止事項 アプリの読み込み時や終了時の表示

インタースティシャル広告の導入における禁止事項 - AdMob ヘルプ
https://support.google.com/admob/answer/6201362?hl=ja&ref_topic=2745287

またGADRewardVideoAdsはリワード広告になりますので、このような実装はリワード広告枠に関するポリシーに抵触する可能性があります。

リワード広告は、ユーザーがその広告を表示することに同意して選択した場合にのみ配信することができます。
また、ユーザーは個々のリワード広告ごとに表示することを選択する必要があり、リワード広告を自動的に表示するように設定することはできません。

リワード広告枠に関するポリシー - AdMob ヘルプ
https://support.google.com/admob/answer/7313578?hl=ja&ref_topic=2745287

なので、具体的な対応は以下になるかと思います。

  • GADInterstitialを使用する
  • 読み込み中を表すだけのViewControllerを作り、アプリ起動直後に表示する
  • ホーム画面のViewControllerでは、表示条件を管理しながら、viewWillAppearのタイミングで表示する

多分こんな具合になるだろうというコードを記載しておきます。

swift

1class FirstViewController: UIViewController, GADInterstitialDelegate { 2 var interstitial: GADInterstitial! 3 4 override func viewDidLoad() { 5 super.viewDidLoad() 6 self.interstitial = GADInterstitial(adUnitID: "本番UnitID") 7 self.interstitial.delegate = self 8 let request = GADRequest() 9 interstitial.load(request) 10 } 11 12 func interstitialDidDismissScreen(_ ad: GADInterstitial) { 13 interstitial.present(fromRootViewController: self) 14 } 15 16 func interstitialDidDismissScreen(_ ad: GADInterstitial) { 17 // ホームとなるViewControllerに遷移する 18 } 19}

swift

1class HomeViewController: UIViewController { 2 var interstitial: GADInterstitial! 3 4 override func viewDidLoad() { 5 super.viewDidLoad() 6 // 広告の読み込み処理 7 } 8 override func viewWillAppear() { 9 super.viewWillAppear() 10 if (self.interstitial.isReady() && /* 表示していいタイミングかどうかの判断処理 */ ){ 11 self.interstitial.present(fromRootViewController: self) 12 } 13 } 14 15}

投稿2018/08/28 09:23

Yajamon

総合スコア88

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

DFP でインタースティシャル広告ユニットを作成してみてはどうでしょう

「DFPInterstitial は、アプリ起動時にプリロードし、アプリの画面が切り替わる自然なタイミングで表示するというライフサイクルでの設定をおすすめします」

リンク内容
リンク内容

投稿2018/08/17 02:18

aja

総合スコア3733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lyzmfeqpxs54

2018/08/19 05:35

ご回答ありがとうございます。返信が遅くなり申し訳ありません。 DFPInterstitialのやり方なのですが、私が現在書いているコードと同様に、そのViewでの書き方はわかるのですが、「アプリ起動時にプリロードし」の部分の書き方がわからない状況です。 参考になるサイトでも構いませんのでご教示いただけますと幸いです。 よろしくお願いいたします。
aja

2018/08/19 10:47 編集

リンクにあるGoogleのGithubのケースではendGame()での広告表示なのでプリロードというのは起動時にロードしているだけです。ただ表示タイミング interstitial.present()はゲーム終わりのAlertviewで表示させるという流れですね 因みに、あなたのやっているのはRewardBasedVideoAdでインターステーシャルではないのですが 同様にゲーム、アプリの何かの終了時に表示するようにすればどうでしょう >広告の表示が、画面遷移後少ししてから表示 > ユーザーがアプリのコンテンツを閲覧している最中に予期せず読み込まれるインタースティシャル広告。 つまり、画面が新しく始まって中途半端なタイミングで表示されるのがNGであれば 画面遷移する前の画面の終わりで広告を表示させる その後に画面遷移する方がいいのかもしれません あるいは、この画面遷移のタイミングがユーザーから見て そもそも良くないのかもしれませんから、ユーザーの立場に立って ガイドラインに沿った表示方法を考えましょう
lyzmfeqpxs54

2018/08/27 01:52

度々のご回答ありがとうございます。返信が遅くなり申し訳ありません。 ご教示いただいたように、アプリ起動時は読み込まず、次にホーム画面に戻ったときに表示をするように変更したいと考えております(本アプリは、学習ツールで、一定期間の勉強でホームに戻ってきます)。 また本題に近くに戻ってしまうのですが、ご教示いただいたように下記のような形でそのViewでの表示はできるのですが、べつのViewで広告を読み込んでおき( interstitial.load(DFPRequest()) )、ホーム画面に戻ってきたときに表示する( interstitial.present(fromRootViewController: self) )といった方法はどのようにすればよいのでしょうか。不勉強で申し訳ございませんがご教示いただけますと幸いです。 // 広告が入る変数 var interstitial: DFPInterstitial! // 広告を読み込む interstitial = DFPInterstitial(adUnitID: "ID_XXXXXX") interstitial.load(DFPRequest()) // 表示する interstitial.present(fromRootViewController: self)
aja

2018/08/27 11:58

https://developers.google.com/mobile-ads-sdk/docs/dfp/ios/interstitial?hl=ja には「DFPInterstitial の使用は 1 回のみ」とありますから毎回インスタンス生成でしょうね そもそも、GADRewardBasedVideoAdなので違うものですよね 「広告をクローズしたところで再度設定し直していますが、これを入れないとユーザーが最後まで見ずに終わった場合、再起動するまでこの広告を再開できないためです」 というのもあるので、そう何回も見せることができないというものと考えた方がいいのかも https://i-app-tec.com/ios/rewarded-video-ads.html
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問