Ad Settings in App's WebView - Hiroaki-Shinoda/Geniee-iOS-SDK GitHub Wiki

アプリ内のWebViewに広告を表示させる

WebViewを用いてアプリケーションを構築する場合に、SDKを用いずに広告を表示する方法を説明します。

概要

Webページにおける広告表示と同様に、管理ツール上から広告タグを取得して表示させたい箇所にタグを設置します。広告タグ単体でも広告の表示は可能ですが、パラメータを設定することでRTB(リアルタイム入札)が実施されます。

広告タグが使用するパラメータ

  • IDFA
  • LAT (Limit Ad Tracking)
  • バンドルID

上記のパラメータは、WebViewが読み込むHTML内でグローバル変数geparamsに設定しておくと広告タグがRTBに使用されます。

広告タグの設置とパラメータの設定イメージ

<script>
  geparams = {};
  geparams.idfa = 'xxxx';    // アプリから取得したIDFA
  geparams.lat =  false;    // アプリから取得したLimit Ad Tracking
  geparams.bundle = 'xxx';  // アプリから取得したバンドルID
</script>

<script src="http://(広告).js"></script>

実際の実装ではアプリの情報を取得しWebView内のJavaScriptで利用するための連携が必要です。詳しい実装方法については以下で紹介します。

アプリの実装

App Transport Security の設定

WebView内に広告を表示可能にするため、App Transport Security を無効にしておきます。(一部広告はHTTPSに対応していないため)

アプリの Info.plist に以下の記述を追記してください。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

アプリ情報の取得

下記のようにRTBに使用するパラメータを取得する実装を用意します。

// 例

- (NSString *)bundleId {
    return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"];
}

- (BOOL)canT
racking {
    if (NSClassFromString(@"ASIdentifierManager")) {
        return [[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled];
    }
    return NO;
}

- (NSString *)idfa {
    if (NSClassFromString(@"ASIdentifierManager")) {
        return [[[ASIdentifierManager sharedManager] advertisingIdentifier]
            UUIDString];
    }
    return @"";
}

JavaScript連携

HTMLを読み込む際に

JavaScript読み始めに

  • (void)viewDidLoad { // 略 NSArray *keywords = @[@"opensafari"]; webViewJsAd = [[GNAdWebviewJavascript alloc] initWithWebView:webView keywords:keywords];

    NSURL *url = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"html"]; [webView loadRequest:[NSURLRequest requestWithURL:url]]; }

Objective-Cコードの編集

WebViewを表示する画面のViewControllerに以下の対応をしてください。 GNAdWebviewJavascriptを初期化し、初期化時にwebViewと外部ブラウザ起動用キーワードの配列を渡します。 外部ブラウザ起動用キーワードは、あらかじめ管理画面でゾーンID毎に登録している文字列です。複数の広告を表示する場合に複数の文字列が必要になるため配列で渡します。

// 例
@implementation ViewController {
    UIWebView *webView;
    GNAdWebviewJavascript *webViewJsAd;
}


WKWebViewを表示する画面のViewControllerに以下のコードを実装します。

外部ブラウザ起動用キーワードの設定

管理画面で登録済みの外部ブラウザ起動用キーワード文字列をアプリ側にも設定する。

// 例
@implementation ViewController {
    NSArray *keywords;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    keywords = @[@"opensafari"];

管理画面で設定済みの外部ブラウザ起動用キーワード文字列は、広告のURLにパラメータとして付加されます。後述しますが、この文字列を含むURLを広告と判定し、広告をタップした際に外部ブラウザで開くように別途実装します。 一つの画面内で複数の広告を表示し、それぞれに別の文字列を指定している場合を想定しNSArrayで確保しています。

viewDidLoadの実装

viewDidLoad内に、下記に示すコードを実装します。WKWebViewでのHTMLページのロードが開始される前に、IDFAとLATの値をjavascriptコードの形でWKWebViewに渡しています。WKWebViewはページロード前に渡されたJavaScriptコードを実行します。

- (void)viewDidLoad {
// 略
    NSString *setParams =
        [NSString stringWithFormat:@"var geparams = window.geparams || {}; "
                                   @"geparams.lat = %@; geparams.idfa = '%@'; geparams.bundle = '%@';",
                                   ![self canTracking] ? @(true) : @(false), [self idfa], [self bundleId]];

    WKUserScript *userScript = [[WKUserScript alloc]
          initWithSource:setParams
           injectionTime:WKUserScriptInjectionTimeAtDocumentStart
        forMainFrameOnly:YES];

    WKUserContentController *userContentController = [[WKUserContentController alloc] init];
    [userContentController addUserScript:userScript];

    WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
    configuration.userContentController = userContentController;
// 略

広告タップ時の対応

広告表示後に、広告をタップするとリンク先を外部ブラウザで開くための対応をします。 ViewControllerにWKNavigationDelegateを実装し、decidePolicyForNavigationActionメソッド内で、管理画面で登録した外部ブラウザ起動用キーワード文字列があるURLを読み込む際に外部ブラウザで開くようにします。以下のコードを参照してください。

// 例
- (void)webView:(WKWebView *)webView
    decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
                    decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    NSURL *url = navigationAction.request.URL;
    NSString *urlString = [url absoluteString];
    for (NSString *keyword in keywords) {
        if ([urlString rangeOfString:keyword].location != NSNotFound) {
            [[UIApplication sharedApplication] openURL:url];
            decisionHandler(WKNavigationActionPolicyCancel);
            return;
        }
    }
    decisionHandler(WKNavigationActionPolicyAllow);
}

ログ出力

WebViewで読み込むHTMLページの<head>タグ内に、以下を記載しtrueを指定すると、ログ出力されます。IDFAやLATの値が正しいか確認する際に使用してください。記載がないか、falseの場合は出力されません。

<script type='text/javascript'>geparams.debuglog = true;</script>
⚠️ **GitHub.com Fallback** ⚠️