FC2ブログ

記事一覧

忍者AdMaxでバナー広告を表示する方法 -iOS編- | Xamarin.Forms


今回はXamarin.iOSの開発環境で忍者AdMaxのSDKを使用してバナー広告を表示する方法についてご紹介いたします。
忍者AdMaxは広告会社他社様と提携しており、様々な広告配信ができるパートナー様ですが、広告を表示する為のSDKがXamarinの正式対応をしておらず、frameworkフォルダのバインド方法ObjectiveSharpieの使用方法など最初はわからず大変苦労しましたが、手順が判明した結果簡単に実装ができることが分かりました。
尚、Xamarin.Androidでの実装方法は前回の記事「忍者AdMaxでバナー広告を表示する方法 -Android編-」をご参考ください。


ExplorerDx
xamarin_nend_ios_01.png
ContactFriends
xamarin_nend_ios_02.png

※画像の広告はnendの広告ですが、忍者AdMaxがnendと提携している為に表示されます。


前提条件
・Windows10 Pro 64Bit
・Visual Studio 2015 Community Update3
・Xamarin 4.3.0.795 (NuGet Xamarin.Forms 2.3.4.247)
・macOS Sierra 10.12.4 / Xcode8.3.1 / Xamarin.iOS 10.6.0.10



1.忍者AdMaxの登録

以下のサイトで登録できます。
http://admax.shinobi.jp/
全て日本語なので登録しやすいですね。

ads_01.png


(1)管理画面左上の「広告枠を追加する」ボタンからスマホアプリ向けの広告枠を登録します。

(2)広告枠の登録
広告枠名:任意
アプリ属性:一般
OS:iOS
アプリ名:アプリ名
Bundle ID:com.CompanyName.AppName
Google Play Url:公開しているURL

数分後から広告が有効になります。

(3)SDKをダウンロードします。
https://github.com/ninjatools/admax-ios-sdk/archive/master.zip

(4)admax-ios-sdk-master.zipファイルを解凍すると
内部にAdMaxSDK.frameworkというフォルダが取得できます。

(5)AdMaxSDKファイルをリネームして拡張子「a」を付けます。
リネーム後:「AdMaxSDK.a
※ファイルの場所は以下に保存されています。
\admax-ios-sdk-master\AdMaxSDK.framework\AdMaxSDK



2.SDKの組み込み方法

(1)Visual Studioでバインドライブラリプロジェクトを作成します。
frameworkフォルダやaファイルなどのXcodeで作成されたファイルはバインドライブラリのプロジェクトを使用すると簡単にObjective-CからC#に変換できます。
 xamarin_nend_ios_03.png


(2)ソリューションエクスプローラを開き、バインドライブラリ内のトップディレクトリにリネームしたaファイル「AdMaxSDK.a」ファイルをドラッグ&ドロップします。


(3)ビルドアクションを 「ObjcBindingNativeLibrary」に変更します。

xamarin_admax_ios_03.png  


(4)Objective Sharpieを使用して以下の変換定義ファイルを作成します。
ApiDefinitions.cs
StructsAndEnums.cs
 ←AdMaxSDK.frameworkからは作成されませんでした。

ダウンロードしたSDKのframeworkフォルダをMac上にコピーし、ターミナルからsharpie bind コマンドで frameworkフォルダ内のHeaderファイル群を読み込みます。
※作成する方法は以前の記事「Objective Sharpieの使用方法」をご参考ください。
 

(5)変換定義ファイルをバインドライブラリプロジェクトのトップディレクトリに配置します。

xamarin_admax_ios_02.png


(6)変換定義ファイルのビルドアクションを変更します。
ApiDefinitions.cs       : ObjcBindingApiDefinition
StructsAndEnums.cs : ObjcBindingCoreSource


(7)変換定義ファイルを修正します。
Objective Sharpieで作成された定義ファイルが正確でないため、修正します。
基本的には以下のように変更していきます。

ApiDefinitions.cs
・interface は public interface に変更
・string は NSString に変更
・***Delegate @***Delegate という引数名称を ***Delegate @p1 というカンジで名称変更
・[Verify]は全てコメントアウト
・[Static]も全てコメントアウト

StructsAndEnums.cs
・nint は long に変更
・enum は public enum に変更



(8)修正後のファイル

ApiDefinitions.cs
using System;
using AdMax.iOS;
using CoreGraphics;
using Foundation;
using ObjCRuntime;
using UIKit;
using AdSupport;
using Security;
using ImageIO;
using SystemConfiguration;
namespace AdMax.iOS
{
// @protocol NAAdViewDelegate <NSObject>
[Protocol, Model]
[BaseType (typeof(NSObject))]
interface NAAdViewDelegate
{
// @optional -(void)adViewWillStartRequest;
[Export ("adViewWillStartRequest")]
void AdViewWillStartRequest ();

// @optional -(void)adViewDidReceiveAd:(NAAdView *)adView;
[Export ("adViewDidReceiveAd:")]
void AdViewDidReceiveAd (NAAdView adView);

// @optional -(void)adViewDidClickAd:(NAAdView *)adView;
[Export ("adViewDidClickAd:")]
void AdViewDidClickAd (NAAdView adView);

// @optional -(void)adViewWillShowDummyAd:(NAAdView *)adView;
[Export ("adViewWillShowDummyAd:")]
void AdViewWillShowDummyAd (NAAdView adView);

// @optional -(void)adViewWillClosedAd:(NAAdView *)adView;
[Export ("adViewWillClosedAd:")]
void AdViewWillClosedAd (NAAdView adView);

// @optional -(void)adView:(NAAdView *)adView didFailRequestWithError:(NSError *)error;
[Export ("adView:didFailRequestWithError:")]
void AdView (NAAdView adView, NSError error);
}

// @interface NAAdView : UIView
[BaseType (typeof(UIView))]
interface NAAdView
{
// @property (copy, nonatomic) NSString * adCode;
[Export ("adCode")]
NSString AdCode { get; set; }

// @property (assign, nonatomic) BOOL tracking;
[Export ("tracking")]
bool Tracking { get; set; }

// @property (assign, nonatomic) BOOL testMode;
[Export ("testMode")]
bool TestMode { get; set; }

// @property (nonatomic, weak) UIViewController * rootViewController __attribute__((iboutlet));
[Export ("rootViewController", ArgumentSemantic.Weak)]
UIViewController RootViewController { get; set; }

[Wrap ("WeakDelegate")]
NAAdViewDelegate Delegate { get; set; }

// @property (nonatomic, weak) id<NAAdViewDelegate> delegate __attribute__((iboutlet));
[NullAllowed, Export ("delegate", ArgumentSemantic.Weak)]
NSObject WeakDelegate { get; set; }

// -(id)initWithFrame:(CGRect)frame adCode:(NSString *)adCode;
[Export ("initWithFrame:adCode:")]
IntPtr Constructor (CGRect frame, NSString adCode);

// -(id)initWithFrame:(CGRect)frame adCode:(NSString *)adCode tracking:(BOOL)tracking;
[Export ("initWithFrame:adCode:tracking:")]
IntPtr Constructor (CGRect frame, NSString adCode, bool tracking);

// -(id)initWithFrame:(CGRect)frame adCode:(NSString *)adCode tracking:(BOOL)tracking testMode:(BOOL)testMode;
[Export ("initWithFrame:adCode:tracking:testMode:")]
IntPtr Constructor (CGRect frame, NSString adCode, bool tracking, bool testMode);

// -(void)setWithAdCode:(NSString *)adCode tracking:(BOOL)tracking;
[Export ("setWithAdCode:tracking:")]
void SetWithAdCode (NSString adCode, bool tracking);

// -(void)setWithAdCode:(NSString *)adCode tracking:(BOOL)tracking testMode:(BOOL)testMode;
[Export ("setWithAdCode:tracking:testMode:")]
void SetWithAdCode (NSString adCode, bool tracking, bool testMode);

// -(void)setWithAdCode:(NSString *)adCode tracking:(BOOL)tracking testMode:(BOOL)testMode delegate:(id<NAAdViewDelegate>)delegate;
[Export ("setWithAdCode:tracking:testMode:delegate:")]
void SetWithAdCode (NSString adCode, bool tracking, bool testMode, NAAdViewDelegate @delegate);

// -(void)loadAd;
[Export ("loadAd")]
void LoadAd ();

// -(void)stopRequest;
[Export ("stopRequest")]
void StopRequest ();
}

[Static]
//[Verify (ConstantsInterfaceAssociation)]
public interface Constants
{
// extern const NSInteger NAAdViewDefaultWidth;
[Field ("NAAdViewDefaultWidth", "__Internal")]
nint NAAdViewDefaultWidth { get; }

// extern const NSInteger NAAdViewDefaultHeight;
[Field ("NAAdViewDefaultHeight", "__Internal")]
nint NAAdViewDefaultHeight { get; }
}
}


StructsAndEnums.cs
using System;
using ObjCRuntime;
namespace AdMax.iOS
{
}



(9)バインドライブラリプロジェクトのプロパティを設定します。
バインドライブラリ→プロパティ→ビルド→「コードの最適化」のチェックをONにします。
この設定をしないと実行時に「Invalid IL code in AdMax.iOS.NAAdView:.ctor (CoreGraphics.CGRect,bool): IL_002b: stloc.0」というエラーが発生します。

xamarin_admax_ios_04.png


(10)iOSアプリのプロジェクトから参照設定を行います。
参照を追加で、iOSバインドライブラリを参照に追加します。



3.広告を表示


iOSプロジェクト内にレンダラーを作成して表示します。
AdBannerクラスはXamarin.Forms.Viewを継承して作成したクラスをPCLのXAMLまたはC#などで画面に配置してください。

AdBannerRenderer.cs
using UIKit;
using CoreGraphics;
using Foundation;
using System;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
[assembly: ExportRenderer(typeof(AdBanner), typeof(AdBannerRenderer))]
namespace AppName.iOS.Renderer
{
    public class AdBannerRenderer : ViewRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.View> e)
        {
            base.OnElementChanged(e);
            if (Control == null)
            {               
                //AdMax
const string adCode = "01234567890123456789abcdef";
this.ShowAdMaxBanner(adCode);
            }
        }

        /// <summary>
/// AdMaxによる広告を表示する
/// </summary>
/// <param name="adCode">adCode</param>
private void ShowAdMaxBanner(string adCode)
{
bool isTracking = true;
bool isTestMode = false;

#if DEBUG
isTestMode = true;
#endif

/*
* AdMaxSDK/NAAdViewの定数
* NAAdViewDefaultWidth = 320;
* NAAdViewDefaultHeight = 50;
*/
var defaultWidth = (float)(AdMax.iOS.Constants.NAAdViewDefaultWidth);
var defaultHeight = (float)(AdMax.iOS.Constants.NAAdViewDefaultHeight);

// new CGRect(x, y, width, height)
CGRect adViewFrame = new CGRect(0, 0, defaultWidth, defaultHeight);
AdMax.iOS.NAAdView adMaxView = new AdMax.iOS.NAAdView(adViewFrame, new NSString(adCode), isTracking, isTestMode);
adMaxView.RootViewController = UIApplication.SharedApplication.KeyWindow.RootViewController;

base.SetNativeControl(adMaxView);

adMaxView.LoadAd();
}
    }
}

※AdCodeは以下のURLから取得できます。
http://admax.shinobi.jp/tag
タグボタンからアドコードの確認ができます。



4.注意点

(1)バインドライブラリを参照設定してもオブジェクトブラウザに名前空間以降が表示されない場合やソースコードでエラーが出る場合はDLLを直接参照設定することで改善される場合があります。




最後までお読みいただきありがとうございます。
当ブログの内容をまとめた Xamarin逆引きメニュー は以下のURLからご覧になれます。
http://itblogdsi.blog.fc2.com/blog-entry-81.html


関連記事

コメント

コメントの投稿

カテゴリ別記事一覧

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語・データベース】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
Oracle10g SQLServer2008R2 SQLAnywhere8/11/16
ActiveReport CrystalReport ReportNet(IBM)
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。