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

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

ただいまの
回答率

88.77%

【Swift】AdMobのリワード動画が実機だと再生できない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,813

midomurasaki

score 46

AdMobのリワード動画を実装しようとしています。

googleが提供しているサンプルをこちらからダウンロードし、pod installpod updateをした上でシミュレーター上で実行すると問題無く動画が再生されます。

サンプルURL:https://github.com/googleads/googleads-mobile-ios-examples
ファイル: googleads-mobile-ios-examples-master/Swift/admob/RewardedVideoExample/RewardedVideoExample.xcworkspace

ですが、実機で実行するとエラーのアラートとログが出力され、動画が再生できません。

スクリーンショット(左:実機, 右:シミュレーター)
実機 シミュレーター

実機ログ(2017/07/20 19:40編集 文字超過のため削除)

Build Settings>Linking>Other Linker Flagsに-ObjCがあるか確認しましたが、最初から入力済でした。
info.plistのATSでHTTP通信を許可してみても変化なしです。

追加
Firebaseのバージョンを3.8.0などに落としてみたりしましたがだめでした。

ログの内容で色々とググってみましたが解決に至らず、解決方法をご存知でしたらご教示ください。

2017/07/20 19:40追記

https://i-app-tec.com/ios/rewarded-video-ads.html
こちらの内容で再度試してみました。
サンプルコードのプロジェクトに新しくViewControllerを追加しています。
が、やはりシミュレーターでは再生OKで実機ではダメでした。

import Firebase
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  var window: UIWindow?

  func application(_ application: UIApplication,
      didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Use Firebase library to configure APIs
    FirebaseApp.configure()
    // Initialize Google Mobile Ads SDK
    GADMobileAds.configure(withApplicationID: "ca-app-pub-3940256099942544~1458002511")

    return true
  }

}
import UIKit
import GoogleMobileAds

class AdmobViewController: UIViewController, GADRewardBasedVideoAdDelegate {

    //    let AdMobID = "[Your AdMob ID]"
    let TEST_ID = "ca-app-pub-3940256099942544/1712485313"
    var AdUnitID:String? = nil

    //    let simulation = true

    /// Is an ad being loaded.
    var adRequestInProgress = false
    var adRedy = false

    /// The reward-based video ad.
    var rewardBasedVideo: GADRewardBasedVideoAd?

    // Button to show AdMob
    @IBOutlet weak var playAd: UIButton!

    @IBOutlet weak var statusLabel: UILabel!


    override func viewDidLoad() {
        super.viewDidLoad()

        //        if simulation {
        AdUnitID = TEST_ID
        //        }
        //        else{
        //            AdUnitID = AdMobID
        //        }

        rewardBasedVideo = GADRewardBasedVideoAd.sharedInstance()
        rewardBasedVideo?.delegate = self

        setupRewardBasedVideoAd()

    }

    func setupRewardBasedVideoAd(){
        statusLabel.text = "set up"

        if !adRequestInProgress && rewardBasedVideo?.isReady == false {
            rewardBasedVideo?.load(GADRequest(),
                                   withAdUnitID: AdUnitID! )

            adRequestInProgress = true
        }
        else{
            print("Error: setup RewardBasedVideoAd")
        }
    }

    @IBAction func playAd(_ sender: AnyObject) {
        print("adRedy=\(adRedy)")

        if GADRewardBasedVideoAd.sharedInstance().isReady && adRedy{
            GADRewardBasedVideoAd.sharedInstance().present(fromRootViewController: self)
            adRedy = false
        }
        else{
            print("Error: Reward based video not ready")
        }
    }

    // MARK: GADRewardBasedVideoAdDelegate implementation
    func rewardBasedVideoAd(_ rewardBasedVideoAd: GADRewardBasedVideoAd,
                            didFailToLoadWithError error: Error) {
        adRequestInProgress = false
        statusLabel.text = "failed to load"

        print("Reward based video ad failed to load: \(error.localizedDescription)")
    }

    func rewardBasedVideoAdDidReceive(_ rewardBasedVideoAd: GADRewardBasedVideoAd) {
        statusLabel.text = "ad is received"
        adRequestInProgress = false
        adRedy = true

        print("Reward based video ad is received.")
    }

    func rewardBasedVideoAdDidOpen(_ rewardBasedVideoAd: GADRewardBasedVideoAd) {
        statusLabel.text = "Opened reward based video ad."

        print("Opened reward based video ad.")
    }

    func rewardBasedVideoAdDidStartPlaying(_ rewardBasedVideoAd: GADRewardBasedVideoAd) {
        print("started playing.")
    }

    func rewardBasedVideoAdDidClose(_ rewardBasedVideoAd: GADRewardBasedVideoAd) {
        statusLabel.text = "ad is closed"
        setupRewardBasedVideoAd()

        print("Reward based video ad is closed.")
    }

    func rewardBasedVideoAdWillLeaveApplication(_ rewardBasedVideoAd: GADRewardBasedVideoAd) {

        print("Reward based video ad will leave application.")
    }

    func rewardBasedVideoAd(_ rewardBasedVideoAd: GADRewardBasedVideoAd,
                            didRewardUserWith reward: GADAdReward) {
        print("Reward received with currency: \(reward.type), amount \(reward.amount).")
    }



    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

実機ログ

2017-07-20 19:21:10.786265+0900 RewardedVideoExample[17506:1685024] [Firebase/Analytics][I-ACS023007] Firebase Analytics v.40002000 started
2017-07-20 19:21:10.787 RewardedVideoExample[17506] <Notice> [Firebase/Analytics][I-ACS023007] Firebase Analytics v.40002000 started
2017-07-20 19:21:10.789715+0900 RewardedVideoExample[17506:1685024] [Firebase/Analytics][I-ACS023008] To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled (see http://goo.gl/RfcP7r)
2017-07-20 19:21:10.791 RewardedVideoExample[17506] <Notice> [Firebase/Analytics][I-ACS023008] To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled (see http://goo.gl/RfcP7r)
2017-07-20 19:21:11.714092+0900 RewardedVideoExample[17506:1684957] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles
2017-07-20 19:21:11.716054+0900 RewardedVideoExample[17506:1684957] [MC] Reading from public effective user settings.
2017-07-20 19:21:12.132385+0900 RewardedVideoExample[17506:1685033] TIC Read Status [1:0x0]: 1:57
2017-07-20 19:21:12.132457+0900 RewardedVideoExample[17506:1685033] TIC Read Status [1:0x0]: 1:57
2017-07-20 19:21:12.364643+0900 RewardedVideoExample[17506:1685066] [Firebase/Analytics][I-ACS003007] Successfully created Firebase Analytics App Delegate Proxy automatically. To disable the proxy, set the flag FirebaseAppDelegateProxyEnabled to NO in the Info.plist
2017-07-20 19:21:12.366 RewardedVideoExample[17506] <Notice> [Firebase/Analytics][I-ACS003007] Successfully created Firebase Analytics App Delegate Proxy automatically. To disable the proxy, set the flag FirebaseAppDelegateProxyEnabled to NO in the Info.plist
2017-07-20 19:21:12.420720+0900 RewardedVideoExample[17506:1685066] [Firebase/Analytics][I-ACS032003] iAd framework is not linked. Search Ad Attribution Reporter is disabled.
2017-07-20 19:21:12.421 RewardedVideoExample[17506] <Warning> [Firebase/Analytics][I-ACS032003] iAd framework is not linked. Search Ad Attribution Reporter is disabled.
2017-07-20 19:21:12.422509+0900 RewardedVideoExample[17506:1685066] [Firebase/Analytics][I-ACS023012] Firebase Analytics enabled
2017-07-20 19:21:12.422 RewardedVideoExample[17506] <Notice> [Firebase/Analytics][I-ACS023012] Firebase Analytics enabled
2017-07-20 19:21:12.507906+0900 RewardedVideoExample[17506:1685028] <Google> Cannot find an ad network adapter with the name(s): com.google.DummyAdapter. Remember to link all required ad network adapters and SDKs, and set -ObjC in the 'Other Linker Flags' setting of your build target.
Reward based video ad failed to load: No ad returned from any ad server.
2017-07-20 19:21:27.199211+0900 RewardedVideoExample[17506:1685066] TIC Read Status [5:0x0]: 1:57
2017-07-20 19:21:27.199416+0900 RewardedVideoExample[17506:1685066] TIC Read Status [5:0x0]: 1:57
2017-07-20 19:21:27.202074+0900 RewardedVideoExample[17506:1685066] [Firebase/Analytics][I-ACS023130] Configuration not found. Using default configuration
2017-07-20 19:21:27.202 RewardedVideoExample[17506] <Warning> [Firebase/Analytics][I-ACS023130] Configuration not found. Using default configuration
2017-07-20 19:21:27.420460+0900 RewardedVideoExample[17506:1685157] TIC Read Status [6:0x0]: 1:57
2017-07-20 19:21:27.420599+0900 RewardedVideoExample[17506:1685157] TIC Read Status [6:0x0]: 1:57
adRedy=false
Error: Reward based video not ready
func rewardBasedVideoAd(_ rewardBasedVideoAd: GADRewardBasedVideoAd,
                            didFailToLoadWithError error: Error) {
        adRequestInProgress = false
        statusLabel.text = "failed to load"

        print("Reward based video ad failed to load: \(error.localizedDescription)")
    }


からは

Reward based video ad failed to load: No ad returned from any ad server.


と返ってきます。
なお、自分で作成したプロジェクト上で、ApplicationIDとGoogleService-Info.plistをFirebaseより生成したもので実行しても結果は同じです。

シミュレーターではできるのに実機で出来ない理由がわかりません。。。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • aja

    2017/07/20 16:15

    同じコードでシミュレーターと実機違うということでしょうか、またダウンロードしたコードは具体的にどれでしょう?ゲーム部分は余計なのでシンプルにして、ダウンロードが完了してから表示させるように変更してみてはどうでしょう

    キャンセル

  • midomurasaki

    2017/07/20 17:15

    ご提案ありがとうございます。ダウンロードしたコードは本文の「こちら」にリンクがございます。ご確認いただけますでしょうか。(わかりにくくてすみません。後ほどURLを直接記載に修正しておきます。)経緯として自分のアプリにシンプル版を実装したもののうまく行かず、サンプルに立ち返ってみたもののうまく行かなかったので質問させていただきました。実は別アプリで以前に実装していてその時はうまく行っていたのですが、改めて実装したらサンプルまで動かなくてかなり混乱しています。

    キャンセル

回答 1

checkベストアンサー

0

RewardedVideoExample
のファイルですね

実は別アプリで以前に実装していてその時はうまく行っていたのですが、改めて実装したらサンプルまで動かなくてかなり混乱しています

コードを出してもらった方がいいと思います
リンクのサンプルが間違っているとはあまり思えませんので

もっともサンプルは余計なゲームや古いコードが入っているようです(非推奨)

GoogleService-Info.plist
は個別にとりましたかbundle IDに紐づけされています

AdUnitIDとApplicationIDは
テスト用のものをそれぞれ使っていますか

GADRewardBasedVideoAdDelegateから情報を見てステータスを把握しましょう

func rewardBasedVideoAd(_ rewardBasedVideoAd: GADRewardBasedVideoAd,
                            didFailToLoadWithError error: Error) {
...
}

参考:
https://i-app-tec.com/ios/rewarded-video-ads.html

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/20 19:41 編集

    回答ありがとうございます。
    ご紹介いただいたURLで再度試してみました。
    結果を本文に更新しました。結論から言うと変わりませんでした。

    AdUnitIDとApplicationIDはテスト用のものを使っています。
    GoogleService-Info.plistも自プロジェクトではFirebase管理画面より生成したものを使っています。
    サンプルコードでは最初から入っていたものをそのまま使っています。

    GADRewardBasedVideoAdDelegateからは
    No ad returned from any ad server.
    が返ってきます。

    シミュレーターでなら成功するというのがとても引っかかります。
    私の実機環境がおかしいだけでしょうか?

    キャンセル

  • 2017/07/20 20:13

    >私の実機環境がおかしいだけでしょうか?

    こちらにヒントがあるかもしれません

    https://groups.google.com/forum/#!searchin/google-admob-ads-sdk/No$20ad$20returned$20from$20any$20ad$20server%7Csort:relevance/google-admob-ads-sdk/IJHU0Qqj1C0/1wIXUsT4AQAJ

    設定、プライバシー、広告
    に追跡型広告を制限とあるのがポイントでしょう

    キャンセル

  • 2017/07/20 20:57

    ああ、なんてことでしょう、まさにこれでした
    "追跡型広告を制限"を解除したら想定通りに再生することができました。

    ご回答ありがとうございました!

    キャンセル

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

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る