読者です 読者をやめる 読者になる 読者になる

iOSアプリにnend広告を実装する方法(インタースティシャル広告編)

アプリの話

 

ヘッポコプログラマーゆえ、iOSアプリにnend広告を実装するだけで苦労してしまいました。

全国に50人はいるだろうヘッポコ同志と、この情報を共有したいと思います。

 

最初は簡単だからって理由でiAd広告を実装してたんですけど、この広告ってマジでセンスないんですよね。配信されてる広告内容が最悪です。しかもAppleが撤退するとかなんとか。

AppleがiOS端末向けのモバイル広告プラットフォーム「iAd」から撤退 - GIGAZINE

そんなわけで我らがnendに乗り換えることを決めました。

 

やっぱnendはいいでしょう。nend、ネンド、粘土さんは。

スマートフォン広告なら日本最大級のnend(スマホweb広告/アプリ広告/アイコン広告/インターステーシャル広告対応)

 

まずはnend登録して、SDKっていうのを発行してもらうんですが、僕はこのサイトを見ました。

Nendで広告を表示してみる - Qiita

登録して広告枠作成して、SDKのダウンロードをするんですが、まあここまでは簡単でした。多分迷わないはずです。

 

んで、引っかかりだしたのは、ここから。NendAd-Bridging-Header の追加からですね。

SDKを手動で追加する · fan-ADN/nendSDK-iOS Wiki · GitHub

 

まず通すべきパスが2つあることに気を付けてください。PROJECTとTARGETの2つあります。

これが片方しか通ってなかったために、結構足止めくらいましたから。

 

f:id:gevvoihorry:20160307052554j:plain

 

それでAllとCombinedを選ぶって点も注意してくださいね。

当たり前のようにLevelsって方を選んだら、どうも具合の悪い事態に陥りますよ。

 

んで肝心のパスですが、これがなかなか通らなかったんですよ。

$(SRCROOT)/$(PRODUCT_NAME)/NendAd-Bridging-Header.h

こう書けば通るって書いてんのに、全然通りません。

 

んで、何事かと調べてたらあれですよ。肝心のフォルダに、そのファイルがありませんでした。

 

f:id:gevvoihorry:20160307053327p:plain

f:id:gevvoihorry:20160307053636j:plain

 

こうやって、通したパスの先に、ちゃんと入れておきましょう。

(ちなみにこれはNeatフォルダの中に入れています)

 

 

ここまで来たら、やっと広告をロード、そして表示する段取りに移ります。

当然のようにここでも苦労しました。

これを見ながらやってたんですが、それでも大変でしたよ。ヘッポコだから。

インタースティシャル広告実装手順 · fan-ADN/nendSDK-iOS Wiki · GitHub

 

まず広告のロードですが、これはAppDelegate.swiftの中に記述します。

 

import UIKit @UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

 

        func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        // Override point for customization after application launch.

 

        NADInterstitial.sharedInstance().loadAdWithApiKey("管理画面より発行された apiKey", spotId: "[管理画面より発行されたspotID]")

 

        return true

    }

 

   //〜省略〜

 

}

 

こう書くわけですが、実際に追記するのは1行だけですね。

 

NADInterstitial.sharedInstance().loadAdWithApiKey("管理画面より発行された apiKey", spotId: "[管理画面より発行されたspotID]")

 

これだけです。

 

さあ、ここまで書けたら、次は広告の表示ですね。

てかここがゴールです。これ出来れば全てOK。

 

import UIKit

class YourOriginalClass: UIViewController {

    //〜省略〜

 

    func showButtonClicked(sender: UIButton) {

 

        var showResult: NADInterstitialShowResult

        showResult = NADInterstitial.sharedInstance().showAd()

 

        switch(showResult.rawValue){

        case AD_SHOW_SUCCESS.rawValue:

            print("広告の表示に成功しました。")

            break

        case AD_SHOW_ALREADY.rawValue:

            print("既に広告が表示されています。")

            break

        case AD_FREQUENCY_NOT_REACHABLE.rawValue:

            print("広告のフリークエンシーカウントに達していません。")

            break

        case AD_LOAD_INCOMPLETE.rawValue:

            print("抽選リクエストが実行されていない、もしくは実行中です。")

            break

        case AD_REQUEST_INCOMPLETE.rawValue:

            print("抽選リクエストに失敗しています。")

            break

        case AD_DOWNLOAD_INCOMPLETE.rawValue:

            print("広告のダウンロードが完了していません。")

            break

        default:

            break

        }

    }

}

 

こう書けば表示されるってあるんですけど、これがサッパリ表示されないんですよ。マジで3日3晩悩みました。

あーでもない、こーでもないとやるんですが、全然解決しません。

 

そこで気付いたんです。

 

これ関数やん

 

これ関数やんかって気が付きました。

 

func showButtonClicked(sender: UIButton)

 

ここからのくだりって、関数の宣言ですよね。多分。

関数をよく分かってないんですが、多分そうでしょう。

 

なのでコードをこうやって変えました。

 

func showButtonClicked() {

        

        var showResult: NADInterstitialShowResult

        showResult = NADInterstitial.sharedInstance().showAd()

        

        switch(showResult.rawValue){

        case AD_SHOW_SUCCESS.rawValue:

            print("広告の表示に成功しました。")

            break

        case AD_SHOW_ALREADY.rawValue:

            print("既に広告が表示されています。")

            break

        case AD_FREQUENCY_NOT_REACHABLE.rawValue:

            print("広告のフリークエンシーカウントに達していません。")

            break

        case AD_LOAD_INCOMPLETE.rawValue:

            print("抽選リクエストが実行されていない、もしくは実行中です。")

            break

        case AD_REQUEST_INCOMPLETE.rawValue:

            print("抽選リクエストに失敗しています。")

            break

        case AD_DOWNLOAD_INCOMPLETE.rawValue:

            print("広告のダウンロードが完了していません。")

            break

        default:

            break

        }

    } 

 

 sender: UIButtonっていう引数がよく分からなかったんで、ここは空にしました。

だから普通にあれですね。showButtonClickedっていう関数を定義しただけです。

んで、override func viewDidLoad() の中showButtonClicked()って書いて、その関数を実行。

 

override func viewDidLoad() {

〜 省略 〜

 showButtonClicked() 

}

 

 

するとビックリ。

 

広告が表示されますがな

 

されますガーナですよ。ガーナミルクチョコレート。

 

だからこの関数だけ定義しといて、あとは条件に合わせて、その中で関数を実行すれば、どこでも広告出せますね。

 

 

はい。iOSアプリにnendのインタースティシャル広告を実装するのに、つまづいた箇所は以上です。

 

てかこれあれですね。

 

ほぼ全箇所でつまづいてますね

 

ヘッポコ同志の参考になれば幸いです。

 

【追記】2016.04.06

なんかインタースティシャル広告の表示方法が変わったとかで、前のコードだとエラーになるようになりましたね。

スマートフォン広告なら日本最大級のnend(スマホweb広告/アプリ広告/アイコン広告/インターステーシャル広告対応)

 

showResult = NADInterstitial.sharedInstance().showAd()

 

このshowAd()がダメなんですよ。SKSceneに表示しようとすると。

 

let showResult = NADInterstitial.sharedInstance().showAdFromViewController(self)

 

こう書けって話なんですが、SpriteKitのSKSceneに表示させるにはどうしたらいいのか。なんか分かりません。。selfがエラーになっちゃって。

とりあえず前のSDKを使えば表示されるんですけどね。いずれshowAd()のメソッドが廃止されるとかで、ヤキモキしています。

 

ひとまずnendさんに問い合わせたんですが、回答やいかに。

 

【追記2】2016.04.14

nendさんに丁寧に教えていただきました。インタースティシャル広告の表示方法を。

ザックリ書くとこれです。

 

func showButtonClicked() {

            

            let showResult = NADInterstitial.sharedInstance().showAdFromViewController(UIApplication.sharedApplication().keyWindow?.rootViewController)

            

            switch(showResult){

            case AD_SHOW_SUCCESS:

                print("広告の表示に成功しました。")

                break

            case AD_SHOW_ALREADY:

                print("既に広告が表示されています。")

                break

            case AD_FREQUENCY_NOT_REACHABLE:

                print("広告のフリークエンシーカウントに達していません。")

                break

            case AD_LOAD_INCOMPLETE:

                print("抽選リクエストが実行されていない、もしくは実行中です。")

                break

            case AD_REQUEST_INCOMPLETE:

                print("抽選リクエストに失敗しています。")

                break

            case AD_DOWNLOAD_INCOMPLETE:

                print("広告のダウンロードが完了していません。")

                break

            case AD_CANNOT_DISPLAY:

                print("指定されたViewControllerに広告が表示できませんでした。")

                break

            default:

                break

            }

        }

 

これでバッチリ表示されますよ。判定するswitch文は余計かもしれませんけど。

(2通りの方法を教えてもらって、本当はもうひとつの方が王道だったんですが、それはエラーで使えなかったです)