Windows Phone - 調整新Advertising SDK的使用
在<Windows Phone - Microsoft Advertising的使用心得>這一篇介紹了如何透過Advertising SDK讓自己的App裡有廣告的呈現,
但最近應該有使用的人都知道一個問題:為何Advetising Control總是出現「No ad available.」!?
為什麼會這個樣子,我也曾因為這個問題寫信至Pubcenter請求Support,但最後的結果反而是被說我的程式有問題,
在這種來回之間沒有答案的問題,該怎麼辦呢?
雖然隨著Advertising SDK 7.1+發佈之後,在App遇到這個問題相對比較少了,因此,我整理了測試Advertising SDK的經驗,
把一些技術分享給大家。
[注意] 以下的說明均SDK是以Windows Phone 8為主,至於Windows Phone 7.1的部分,此處不加以討論。
〉初始化設定「CurrentThread.CurrentCulture」已無用:
過去在WP7啟動App(如:App.xaml.cs的App())時,我建議大家加上如下的程式段:
「System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");」
現在已經不需要了,應該說新SDK已不在受限System.Threading.Thread.CurrentThread.CurrentCulture的限制了。
〉以程式方式加入AdControl的方式取代透過XAML的設定:
由於AdControl偶爾還是會出現「No ad available.」的錯誤訊息,因此,我建議透過程式碼的方式去控制AdControl。
並且註冊ErrorOccurred來控制遇到錯誤時要怎麼處理,常見的處理方式有:
a. 更換AdControl使用另一組Application ID與AdUnit;
b. 切換不同的廣告元件,例如:Admob;
c. 加入自己建置的廣告,隨著用戶點擊時串聯Marketplace建議他們安裝自己的App;
d. …等;
這些作法其實均是為了讓廣告元件不要空白沒有作用。
以上介紹一個簡單的作法,透過程式控制加入AdControl,並且註冊當ErrorOccured發生時,可以切換不同的廣告元件;
#region Pubcenter廣告
public AdControl AddPubCenterAd()
{
//建立新的AdControl元件
AdControl adControl = new AdControl("ApplicationId", "AdUnit", true);
adControl.Width = 480;
adControl.Height = 80;
//更新AdControl的Templated()
adControl.ApplyTemplate();
//註冊ErrorOccurred事件
adControl.ErrorOccurred += adControl_ErrorOccurred;
return adControl;
}
void adControl_ErrorOccurred(object sender, Microsoft.Advertising.AdErrorEventArgs e)
{
Dispatcher.BeginInvoke(() =>
{
//當遇到錯誤時,清掉放置廣告的StackPanel中的子項目;
if (AdPanel.Children.Count > 0) AdPanel.Children.Clear();
//加入新的廣告元件:Admob
if (AdPanel.Children.Count == 0) AdPanel.Children.Add(AddAdmob("manageId"));
});
}
#endregion
#region Admob廣告
private AdView AddAdmob(string pAdUnitID)
{
//建立一個新的Admob元件
AdView bannerAd = new AdView
{
Format = AdFormats.Banner,
AdUnitID = pAdUnitID,
Width = 480,
Height = 80
};
//註冊錯誤FailedToReceiveAd 的處理方式
bannerAd.FailedToReceiveAd += OnFailedToReceiveAd;
AdRequest adRequest = new AdRequest();
bannerAd.LoadAd(adRequest);
return bannerAd;
}
private void OnFailedToReceiveAd(object sender, AdErrorEventArgs errorCode)
{
Dispatcher.BeginInvoke(() =>
{
//當遇到錯誤時,清掉放置廣告的StackPanel中的子項目;
if (AdPanel.Children.Count > 0) AdPanel.Children.Clear();
//加入新的廣告元件:AdControl
if (AdPanel.Children.Count == 0) AdPanel.Children.Add(AddPubCenterAd());
});
}
#endregion
透過這樣的方式,可以讓廣告元件的搭配更多元。
而且我測試下來,直接加在XAML裡的內容比較常出現No ad available。(實際還要在詳細測試,這只是我的Case);
〉解決在手機佈景主題為Light時,廣告元件看不到:
最近發現當手機佈主題設定為Light時,AdControl因為字是白色的,所以整個會看不見。
因此,藉由識別Theme的類型來設定一下放置AdControl的容器(StackPanel)。程式碼如下:
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
//增加判斷主題不同加上背景讓廣告可以出來
if (LightThemeUsed() == true)
AdPanel.Background = Application.Current.Resources["PhoneChromeBrush"] as Brush;
else
AdPanel.Background = Application.Current.Resources["Transparent"] as Brush;
//加入廣告元件
if (AdPanel.Children.Count() == 0) AddAdControl();
}
bool DarkThemeUsed()
{
return Visibility.Visible == (Visibility)Application.Current.Resources["PhoneDarkThemeVisibility"];
}
bool LightThemeUsed()
{
return Visibility.Visible == (Visibility)Application.Current.Resources["PhoneLightThemeVisibility"];
}
======
以上是分享自己在使用Pubcenter的廣告元件心得,我相信很多開發者也都希望透過廣告元件來做為收益的一種。
因此,分享該篇文章協助大家,希望能有所幫助。如果有新技術或偏方我會也補充上來,謝謝。
References:
‧Developing - Advertising SDK for Windows Phone
‧Use the Recommended AdUnit Format Size and AdControl Size
‧Advertising SDK - Known Issues
‧Localization <SupportedCultures> - Advertising SDK for Windows Phone
‧Globalization and localization for Windows Phone
‧How to build a localized app for Windows Phone