Windows Phone - 調整新Advertising SDK的使用

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

IsEngaged Property

Localization <SupportedCultures> - Advertising SDK for Windows Phone

Globalization and localization for Windows Phone

How to build a localized app for Windows Phone

 

Dotblogs 的標籤: