Windows Phone - Nokia Ad Exchange (NAX)
撰寫App發佈至Marketplace,除了是爽度證明自己開發的能力與創意之外,當然會希望多少能為自己賺一些外快。
之前撰寫過<Windows Phone - Microsoft Advertising的使用心得>,讓我自己在App裡使用廣告,偶爾還是會收到錢。
今天要介紹的主要是Nokia Ad Exchange,其實Nokia是在WP投入最有心的廠商,因此,來看一下他廣告怎麼使用吧。
按照以下歩驟,應能很快速地在App建立起Advertising:
(1) 申請帳號:
請至「https://nax.nokia.com/iamp/nokia/signup」,依下圖畫面將必要的資料進行填寫,填寫後將會收到mail通知已註冊:
需注意的是,這個申請跟一般申請hotmail帳號不一樣,需等待幾天的審核之後才會進行Mail的通知。
如果通過申請的話,將會收到如下方的Mail,告知您可以去登入Nokia Ad Exchange建立自己的App ID:
(2) 設定帳號資料與匯款機制:
申請成功後,第一次登入Nokia Ad Exchange會需填寫個人資料與匯款資料,可參考以下的填寫內容,
不過要記得「中文不可行」,它的問題與過去Dev Center一樣無法正確儲存中文,所以建議以英文來撰寫個人資料;
a. 填寫個人資料;
b. 填寫匯款方式;
此部分我以Paypal為例,它有很多種匯款的方式供我們選擇,但避免像Dev Center(現在有Paypal)或Advertising比較複雜的付款方式,
我建議選擇Paypal,只要申請一個Paypal帳號後,它在建立時會需要您輸入登入Paypal的帳號與密碼。
(3) 建立需要App ID:
建立App ID需要必填以下的項目內容:
欄位 | 說明 |
Platform | 選擇Windows Phone; |
App Name | 該App Name與實際發佈至Dev Center的不需一致,主要是用於識別該App ID為何物而已;(無法輸入中文); 該App Name即為AppID; |
Store Download Link | 請輸入App在http://www.windowsphone.com網頁市集中的URL,也可以至Dev Center針對該App取得Deep Link; |
Category | 選擇該App所屬的類型;具有多種,建議與Dev Center中選擇的一致 |
App Descrption | 描述該App ID的內容;(無法輸入中文,儲存會變成亂碼); |
Age group | 建議選擇All,如果您的App有年紀限制,再選擇其他的選項; |
Use location | 根據您的App是否有使用Location功能再選擇; |
(4) 下載SDK,並且加入自己的專案中;
具有多種SDK版本以支持不同的平台使用,目前我們以下載「Windows Phone 8」為例。
a. 下載好SDK後,進行解壓縮取得「InneractiveAdSDK」目錄;
b. 將「InneractiveAdSDK」目錄中的「Inneractive.Ad.dll」進行解鎖;
b-1. 在Inneractive.Ad.dll按滑鼠右鍵,選擇「內容」;
b-2. 點擊「解除封鎖」,按下「確認」或「套用」;
c. 複製「InneractiveAdSDK」目錄中的「Inneractive.Ad.dll」與「InneractiveAdLocation.cs」至自己的WP專案;
c-1. InneractiveAdLocation.cs 放置與其他.cs或.xaml同一層目錄;
c-2. Inneractive.Ad.dll 放置專案中的 [\bin」目錄;
d. 將Inneractive.Ad.dll加入專案參考;
e. 打開WMAppManifest.xml中加入必要的<Capabilities/>;
<Capabilities>
<Capability Name="ID_CAP_NETWORKING" />
<Capability Name="ID_CAP_WEBBROWSERCOMPONENT" />
<Capability Name="ID_CAP_PHONEDIALER" />
<Capability Name="ID_CAP_IDENTITY_DEVICE" />
</Capabilities>
ID_CAP_NETWORKING、ID_CAP_WEBBROWSERCOMPONENT、ID_CAP_PHONEDILAER、ID_CAP_IDENTITY_DEVICE;
f. 開啟要加入Nokia Ad Exchange的Page,在xaml中加入Nokia Ad Exchange的xaml內容:
<!-- AppID即是在Nokia Ad Exchange網站登錄的app name -->
<ad:InneractiveAd
xmlns:ad="clr-namespace:Inneractive.Nokia.Ad;assembly=Inneractive.Ad"
AppID="MyCompany_MyApp"
AdType="IaAdType_Banner"
ReloadTime="60"
Name="InneractiveXamlAd" />
g. 接著啟動設備來看一下結果:
以上是介紹簡單將Nokia Ad Exchange加到自己的App之中,是不是非常容易呢!但Nokia Ad Exchange不只有這樣而已,它還提供很多,
包括:廣告的類型、事件的操控、用戶點擊廣告事件的擷取等,往下便一一說明。
〉InneractiveAd:
建立該物件或使用XAML撰寫時,必要的屬性如下:
(1) AppID:
An App ID is provided to you upon the creation of an app on your inneractive console . (即是上述步驟所建立的App Name);
(2) AdType:
具有三種類型:
a. IaAdType_Banner:橫幅圖像廣告;
b. IaAdType_Text:純文字(連結)廣告;
c. IaAdType_Interstitial:插入性整頁廣告;(該廣告要搭配事件,讓用戶點擊後,不再呈現,不然會一直出現關不掉)
透過下圖來識別:
(3) Reload Time:
The number of seconds between ad refreshes. (This value is not relevant for interstitial ads.)
The minimum interval is 30 seconds. The default interval is 60 seconds. (最小30秒;預設60秒;)
廣告重新整理(取得)的間隔時間。建議使用預設即可,因為用戶不會一直點,所以僅要有呈現才是我們的重點;
〉利用程式控制InneractiveAd:
inneractive SDK 提供二種方式讓開發人員可以掌握更多功能:
a. calling a method:
// optionalParams為一個dictionary可放置有關設定InneractiveAd物件的參數;
InneractiveAd.DisplayAd("MyCompany_MyApp",
InneractiveAd.IaAdType.IaAdType_Banner,
ContentPanel,
60,
optionalParams);
如果未設定optionalParams,系統將會出現:「Object reference not set to an instance of an object.」的錯誤;
b.using a control;
// optionalParams為一個dictionary可放置有關設定InneractiveAd物件的參數;
InneractiveAd iaBanner = new InneractiveAd(
"MyCompany_MyApp",
InneractiveAd.IaAdType.IaAdType_Banner,
60,
optionalParams);
// 加入畫面中
ContentPanel.Children.Add(iaBanner);
〉改善InneractivtAd的Performance:
上述有描述到一個參數「optionalParams」與其他作法可以調整InneractiveAd的效果,並建立比較好的user experience。
根據<WindowsPhone 8 SDK guidelines>的內容,針對幾個主題來加以說明:
(A) Supplying additional parameters to improve ad targeting:
以下提供多種參數以控件InneractiveAd有更好的呈現,並且能夠投遞用戶於該App預計可收到的廣告內容。
Paramaters name (C#) | Paramaters name (XML) | Description |
Key_Location | Location | 填入國家別,以「,」隔開,中間沒有空格。
例如:US,NY,NY。 (註) 填TW有無廣告呢?有的,但不會是中文的廣告; |
Key_keywords | Keywords | 類似用戶的特定會話相關的關鍵詞,以「,」隔開,中間沒有空格。
例如:cars,music,sport。 |
Key_Gps_Coordinates | GPS | GPS標準代碼資料,包括經/緯度,以「,」隔開,中間沒有空格。
例如:53.542132,-2.239856。 (註) 如果使用了該屬性,要記得至WMAppManifest.xml加入「ID_CAP_LOCATION」這個Capability。(建議最好一開始就加入該特性) 如果沒有設定該值的話,SDK仍會自己取得。 |
Key_Gender | Gender | 用戶的性別。值:M, m, F, f, Male, and Female。
|
Key_Age | Age | 用戶的年紀。
|
Key_Ad_Alignment | AdAlignment | IaAdType_Banner專用,橫幅廣告在容器內(例如:Grid)的對齊方式。
其值如下: •InneractiveAd.IaAdAlignment.TOP_LEFT •InneractiveAd.IaAdAlignment.TOP_CENTER •InneractiveAd.IaAdAlignment.TOP_RIGHT •InneractiveAd.IaAdAlignment.BOTTOM_LEFT •InneractiveAd.IaAdAlignment.BOTTOM_CENTER •InneractiveAd.IaAdAlignment.BOTTOM_RIGHT •InneractiveAd.IaAdAlignment.CENTER_LEFT •InneractiveAd.IaAdAlignment.CENTER •InneractiveAd.IaAdAlignment.CENTER_RIGHT |
Key_OptionalAdWidth | OptionalAdWidth | IaAdType_Banner專用,指定該width值並不能保證每次都能收到指定width的廣告,除非遇到廣告的容器可以納入指定的size。
如果需要指定廣告的寬度,可以使用該參數。 |
Key_OptionalAdHeight | OptionalAdHeight | IaAdType_Banner專用,指定該height值並不能保證每次都能收到指定height的廣告,除非遇到廣告的容器可以納入指定的size。
如果需要指定廣告的寬度,可以使用該參數。 |
Key_RequiredAdWidth | RequiredAdWidth | 為廣告元件指定一個執行時需要的width。
指定該值後不管廣告有無被找到,均會保留固定的width。 使用這個參數會影響畫面的填充率,建議使用於當畫面只有一個有限位置來呈現廣告的情境,再使用這屬性。 |
Key_RequiredAdHeight | RequiredAdHeight | 為廣告元件指定一個執行時需要的height。
指定該值後不管廣告有無被找到,均會保留固定的height。 使用這個參數會影響畫面的填充率,建議使用於當畫面只有一個有限位置來呈現廣告的情境,再使用這屬性。 |
關於指定Ad的width/height範圍有:
‧300 x 50
‧320 x 50
‧480 x 80
‧300 x 250 (rectangle)
‧320 x 480 (interstitial)
了解有那些參數後,舉例程式範例:
private void AddNokiaAd()
{
// 設定Ad元件需要的參數
Dictionary<InneractiveAd.IaOptionalParams, string> tOptionParams =
new Dictionary<Inneractive.Ad.InneractiveAd.IaOptionalParams, string>
{
{InneractiveAd.IaOptionalParams.Key_Age, "25"},
{InneractiveAd.IaOptionalParams.Key_Gender, "m"},
{InneractiveAd.IaOptionalParams.Key_Keywords, "test,inneractive"},
{InneractiveAd.IaOptionalParams.Key_Gps_Coordinates, "53.5422,-2.2396"},
{InneractiveAd.IaOptionalParams.Key_Location, "US,NY,NY"},
{InneractiveAd.IaOptionalParams.Key_Ad_Alignment, InneractiveAd.IaAdAlignment.CENTER.ToString()},
{InneractiveAd.IaOptionalParams.Key_OptionalAdWidth, "480"},
{InneractiveAd.IaOptionalParams.Key_OptionalAdHeight, "80"}
};
// 建立Ad物件,因上述使用了Key_OptionalAdWidth/Key_OptionalAdHeight,
// 所以Ad Type選用:IaAdType_Banner
InneractiveAd tAd1 = new InneractiveAd("MyCompany_MyApp",
InneractiveAd.IaAdType.IaAdType_Banner,
60, tOptionParams);
ContentPanel.Children.Add(tAd1);
}
(B) Providing a more seamless integration between ads and application content:
上述介紹了Ad元件的參數讓廣告內容投遞可以更加符合需求。接下來,討論如何讓Ad元件與App做一些互動,例如:
用戶點擊了廣告的事件後要暫停廣告的投遞、廣告元件收到廣告或無廣告的訊息…等。
InneractiveAd提供了以下四種事件:
Event name | Description |
AdReceived | 當一個新的付費廣告資訊被收到與顯示於畫面上,觸發該事件;
|
DefaultAdReceived | 當一個新的house ad資訊被收到與顯示畫面上,觸發該事件;
|
AdFailed | 當一個廣告請求失敗無法取到廣告資訊時,觸發該事件; |
AdClicked | 當用戶點擊了該廣告,觸發該事件。 |
範例程式如下:
private void InitAdd()
{
InneractiveAd tAd1 = new InneractiveAd("MyCompany_MyApp",
InneractiveAd.IaAdType.IaAdType_Banner,
60, tOptionParams);
// 註冊相關事件的處理
tAd1.DefaultAdReceived += tAd1_DefaultAdReceived;
tAd1.AdReceived += tAd1_AdReceived;
tAd1.AdFailed += tAd1_AdFailed;
tAd1.AdClicked += tAd1_AdClicked;
}
void tAd1_AdClicked(object sender)
{
System.Diagnostics.Debug.WriteLine("InneractiveAd: AdClicked");
}
void tAd1_AdFailed(object sender)
{
// failed事件一定要處理,因為當沒有廣告收到時,
// 如果你有設定RequiredWidth/RequireHeight的話,記得把Ad隱藏才不會留一個空白;
System.Diagnostics.Debug.WriteLine("InneractiveAd: AdFailed");
}
void tAd1_AdReceived(object sender)
{
System.Diagnostics.Debug.WriteLine("InneractiveAd: AdReceived");
}
void tAd1_DefaultAdReceived(object sender)
{
System.Diagnostics.Debug.WriteLine("InneractiveAd: DefaultAdReceived");
}
failed事件一定要處理,當沒有廣告收到時, 如果你有設定RequiredWidth/RequireHeight的話,記得把Ad隱藏才不會留一個空白;
(C) Using location-based ads:
另一個使用NAX Ad的重點在於使用location-based,增加投遞廣告的效果。在使用上有幾點要注意:
a. 由於需要使用Location的功能,要記得至WMAppManifest.xml加入「ID_CAP_LOCATION」的Capability;
b. 應用程式要加上處理Location的擷取與定位;
c. Nokia Ad Exchange對於location-based的Ad很貼心的提供了「InneractiveAdLocation.cs」讓開發人員可以直接使用;
這三點是搭配location特性要注意的,透過範例程式來說明藉由「InneractiveAdLocation.cs」如何操作:
private void AddAdUnitByLocation()
{
IaLocationClass iaLocation = new IaLocationClass();
iaLocation.Done += new System.EventHandler<IaLocationEventArgs>(iaLocation_Done);
iaLocation.StartWatchLocation();
}
void iaLocation_Done(object sender, IaLocationEventArgs e)
{
// 設定Ad元件需要的參數
Dictionary<InneractiveAd.IaOptionalParams, string> tOptionParams =
new Dictionary<Inneractive.Ad.InneractiveAd.IaOptionalParams, string>
{
{InneractiveAd.IaOptionalParams.Key_Age, "25"},
{InneractiveAd.IaOptionalParams.Key_Gender, "m"},
{InneractiveAd.IaOptionalParams.Key_Keywords, "test,inneractive"},
{InneractiveAd.IaOptionalParams.Key_Location, "US,NY,NY"},
{InneractiveAd.IaOptionalParams.Key_Ad_Alignment, InneractiveAd.IaAdAlignment.CENTER.ToString()},
{InneractiveAd.IaOptionalParams.Key_OptionalAdWidth, "480"},
{InneractiveAd.IaOptionalParams.Key_OptionalAdHeight, "80"}
};
if (e != null && e.location != null)
{
try
{
tOptionParams.Add(InneractiveAd.IaOptionalParams.Key_Gps_Coordinates, e.location);
}
catch (ArgumentException ex)
{
System.Diagnostics.Debug.WriteLine("Location problem: " + e.location);
}
}
// 建立Ad物件,因上述使用了Key_OptionalAdWidth/Key_OptionalAdHeight,
// 所以Ad Type選用:IaAdType_Banner
InneractiveAd tAd1 = new InneractiveAd("MyCompany_MyApp",
InneractiveAd.IaAdType.IaAdType_Banner,
60, tOptionParams);
ContentPanel.Children.Add(tAd1);
}
利用IaLocationClass啟動Location服務來擷取目前用戶的所在位置,接著在Done的Event Handler來處理廣告單元的建立。
如果找不到IaLocationClass可以到「InneractiveAdSDK」目錄中的「InneractiveAdLocation.cs」至自己的WP專案。
相關Location的使用,另外可參考以下文章的說明:
‧Windows Phone 7 - 學習Location Service與Map地圖
‧Windows Phone 7 - 使用Google Map API將地址轉成座標
‧Windows Phone - 深入使用Bing Map - 客製Pushpin
更完整的官方程式可以參考<Windows Phone 8 SDK guidelines>的內容。
[注意]
1. inneractive SDK不支援在Visual Studio designer呈現內容;
2. inneractive SDK不支援透過XAML來呈現插播性( Interstitial )廣告的呈現,建議使用code的方式呼叫DisplayAd()方法來呈現插播性廣告。
======
以上是簡單介紹Nokia Ad Exchange的部分,我個人覺得非常容易上手,至於廣告投遞的成效如何,
可能還需要時間來證明一下,但我相信如果使用Nokia Ad Exchange的人多,廠商看到也會到Nokia Ad Exchange中增加廣告內容,
這樣我們開發人員也能更有賺錢的機會。
References:
‧Nokia opens up two developer programs
‧SDK integration - Windows Phone (重要)
‧Windows Phone 8 SDK guidelines (重要)