Windows Phone - Microsoft Advertising的使用心得

Windows Phone - Microsoft Advertising的使用心得

在撰寫Windows Phone程式時,如果您也是寫免費的應用就會想要在App裡加上廣告,

可以從中取得一些小小小的生活費,那也許您可以參考我之間寫過的文章:

<Windows Phone 7 - 開發免費版程式,就來加個廣告吧! - 1>與

<Windows Phone 7 - 開發免費版程式,就來加個廣告吧!– 2>這二篇介紹了幾個常用的廣告元件,

其中有些廣告元件的收益方式蠻特別的,或者是你用了也不太有廣告出現的,後來選擇了Microsoft Advertising,

但是一開始因為沒有支援台灣區的匯款方式,因此,只能申請美國的帳號,加上本人也不是美國的公民沒有ID

也沒有辦法收到錢,隨著種種因素,台灣區終於在2012的8月開始支援,但到了2012的9月底才能真正填寫台灣匯款方式。

也許你會想問,那之前還沒有開放前你賺的那些廣告費呢?我只能淡定的說:正在爭取中;

 

不管你是否是第一次或已經使用Microsoft Advertising,本身主要是針對應用於Windows Phone上的心得,

說明如下:

(1) 為何無法顯示Advertising在我的程式裡

      如果您撰寫的應用程式在預設語系是英文(en-US)Advertising元件就會有廣告內容。但如果不是就完全沒有了

      例如:zh-TW,很抱歉,不是程式掛掉了是現在沒有zh-TW語系的廣告在上面,因此,要怎麼讓廣告跑出來呢?

      可以使用下列的方式:

      1-1. 專案中的App.xaml.cs檔案下的:App()建構子,加入下方的程式碼

   1: /// <summary>
   2: /// Constructor for the Application object.
   3: /// </summary>
   4: public App()
   5: {
   6:     //上述程式省略
   7:     #region App自訂處理範圍
   8:     //將CurrentCulture改為en-US,這樣廣告就可以出現了;
   9:     System.Threading.Thread.CurrentThread.CurrentCulture =
  10:            new System.Globalization.CultureInfo("en-US");
  11:  
  12:     //至於程式的多語系,改的是CurrentUICulture,二種是不同的;
  13:     System.Threading.Thread.CurrentThread.CurrentUICulture =
  14:            new System.Globalization.CultureInfo("zh-TW");
  15:     #endregion
  16: }

               將CurrentCulture的語系別設定為:en-US,這樣廣告就會出現了;那這樣會影響到應用程式的Localized呈現嗎?

               完全不會,因為Localized修改的是CurrentUICulture的語系別

                

(2) 從墓碑(Trombone)回到應用程式時,Advertising元件會發出Exception造成程式Crash

       這個問題一直存在Advertising SDK裡,但這不能夠掛它,因為該廣告元件使用的是WebBrowser的元件,這個元件在

墓碑還回時,有時候就會出現不知名的Exception出現,因此,要怎麼辦呢?

       2.1. 建立一個方法,GetNewAdvControl()用來重建廣告元件,並且註冊處理ErrorOccurred的事件

   1: #region AdControl廣告元件
   2: private AdControl GetNewAdvControl()
   3: {
   4:     AdControl tControl = new AdControl("AppId", "UnitID", true);
   5:     tControl.Name = "adControl1";
   6:     tControl.Width = 480;
   7:     tControl.Height = 80;
   8:     tControl.CountryOrRegion = "US";
   9:     tControl.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
  10:     tControl.VerticalAlignment = System.Windows.VerticalAlignment.Top;
  11:     //一定要記得註冊該事件,用於當廣告沒有出現時,要求畫面將廣告元件隱藏;
  12:     tControl.ErrorOccurred += new EventHandler<Microsoft.Advertising.AdErrorEventArgs>(adControl1_ErrorOccurred);
  13:     return tControl;
  14: }
  15: private void adControl1_ErrorOccurred(object sender, Microsoft.Advertising.AdErrorEventArgs e)
  16: {
  17:     //載入廣告失敗,隱藏廣告元件的高度比率
  18:     AppContainer.AdjustGridRows(ContentPanel, 100, 0);
  19:     //lstReportCollection.Height = 490;
  20: }
  21: private void adControl1_Loaded(object sender, RoutedEventArgs e)
  22: {
  23:     //載入廣告成功,設定廣告元件的高度比率
  24:     AppContainer.AdjustGridRows(ContentPanel, 78, 13);
  25:     lstReportCollection.Height = 410;
  26: }
  27: #endregion

               這裡面的方式非常好用,因為我把廣告元件也放在xaml檔中的一個洞,這樣當廣告載入失敗時,即可以隱藏它,

               並且更新其整個版面比較靈活。當然,也可以考慮使用PopupControl來包裝廣告元件,但相對的要處理的事也多了,

               例如:OnNavigatedFrom()或按過了要隱藏、OnNavigatedTo()或未按過要顯示。

 

       2.2. 針對有加入廣告頁的xaml檔,在OnNavigatedTo()方法裡加上處理的方式

   1: protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
   2: {
   3:     base.OnNavigatedTo(e);
   4:     //調整AdControl點擊出去,再回來畫面後造成Exception的問題。
   5:     if (spAdvPanel.Children.Count == 0)
   6:     {
   7:         //在挖好的洞,加入廣告元件;
   8:        spAdvPanel.Children.Add(GetNewAdvControl());
   9:     }
  10: }

 

(3) 使用User Control建立一個Popup類別的廣告元件

       上述有提到透過Popup類別來建立廣告元件的機制,包括:點擊之後廣告自動消失,記下按下去的時間,下一次啟動

程式時判斷是否超過1天,如果是又再一次顯示廣告。下方提供一個簡單AdDuplex的廣告元件範例做為參考;

       3.1. 建立UserControl,加入Popup類別,實作AdDuplex的AdClick(),記錄用戶點擊廣告的時間做為下次顯示的比較

   1: public partial class UCAdpControl : UserControl
   2: {
   3:     public UCAdpControl()
   4:     {
   5:         InitializeComponent();
   6:     }
   7:  
   8:     /// <summary>
   9:     /// 定義PopupControl元素。
  10:     /// </summary>
  11:     internal Popup PopupControl
  12:     {
  13:         get;
  14:         private set;
  15:     }
  16:  
  17:     /// <summary>
  18:     /// 設定/取得加入廣告元素頁面給的高度比率;
  19:     /// </summary>
  20:     public double PageHeight { get; set; }
  21:  
  22:     /// <summary>
  23:     /// 顯示廣告元件。
  24:     /// </summary>
  25:     public void ShowAdpControl()
  26:     {
  27:         if (PopupControl == null)
  28:         {
  29:             PopupControl = new Popup();
  30:             PopupControl.Child = this;
  31:         }
  32:         //判斷PopupControl是否不為null,並檢查是否需要顯示廣告
  33:         if (PopupControl != null && CheckShowAdpControl() == true)
  34:         {
  35:             this.PopupControl.IsOpen = true;
  36:             //設定Popup控件要顯示在Page上的位置比率
  37:             this.PopupControl.VerticalOffset = this.PageHeight * 0.79;
  38:             this.PopupControl.HorizontalOffset = 0; 
  39:             LayoutRoot.Width = 480;
  40:             LayoutRoot.Height = 110;
  41:         }
  42:     }
  43:     /// <summary>
  44:     /// 隱藏廣告元件。
  45:     /// </summary>
  46:     public void HideProgress()
  47:     {
  48:         this.PopupControl.IsOpen = false;
  49:     }
  50:  
  51:     /// <summary>
  52:     /// 按下廣告時,透過IsolatedStorage.IsolatedStorageSettings來記錄;
  53:     /// </summary>
  54:     /// <param name="sender"></param>
  55:     /// <param name="e"></param>
  56:     private void AdpBanner_AdClick(object sender, AdDuplex.AdClickEventArgs e)
  57:     {
  58:         //呼叫IsolatedStorage.IsolatedStorageSettings來檢查
  59:         if (ISOHandler.UserSettings.Contains("PressAdp") == false)
  60:             //未有值就加一個時間
  61:             ISOHandler.UserSettings.Add("PressAdp", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
  62:         else
  63:             //有值就修改時間
  64:             ISOHandler.UserSettings["PressAdp"] = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
  65:         //隱藏廣告
  66:         this.PopupControl.IsOpen = false;
  67:     }
  68:  
  69:     /// <summary>
  70:     /// 檢查記錄在IsolatedStorage.IsolatedStorageSettings的點擊時間,
  71:     /// 是否有超過1天。
  72:     /// </summary>
  73:     /// <returns></returns>
  74:     private bool CheckShowAdpControl()
  75:     {
  76:         bool tResult = true;
  77:         if (ISOHandler.UserSettings.Contains("PressAdp") == true)
  78:         {
  79:             //轉型日期
  80:             DateTime tPressDT = DateTime.Parse(ISOHandler.UserSettings["PressAdp"].ToString());
  81:             tPressDT = tPressDT.AddDays(1);
  82:             if (tPressDT.CompareTo(DateTime.Now) != -1)
  83:             {
  84:                 tResult = false;
  85:             }
  86:         }
  87:         return tResult;
  88:     }    
  89: }

              上述的程式碼僅做為參考用,實際的用法大家可加入自己的情境去包裝它。只是我覺得Popup類別還蠻好的,所以蠻

              常使用於在貼在畫面上的顯示內容;

 

       3.2. 在加入的Page中,增加OnNavigatedFrom()、OnNavigatedTo()與PhoneApplicationPage_Loaded()處理廣告元件

               宣告一個全域變數,透過在Loaded()事件將控件初始化,至於為何不在建構子中建立就好,請參考當麻在

               <[Silverlight] Loaded & LayoutUpdated 的順序>的說明,其實對於畫面內容的動態呈現,建議在Loaded()機制裡做

               效果比較好,可以確保內容可正常顯示;

               3.2.1. PhoneApplicationPage_Loaded():建立廣告元件

   1: private UCAdpControl gUCAdpControl = null;
   2: private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
   3: {
   4:     if (gUCAdpControl == null)
   5:     {
   6:         gUCAdpControl = new UCAdpControl();
   7:         gUCAdpControl.PageHeight = App.Current.RootVisual.RenderSize.Height;
   8:         gUCAdpControl.ShowAdpControl();
   9:     }
  10: }

               3.2.2. OnNavigatedFrom():在離開畫面時,把廣告元件隱藏起來

   1: protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
   2: {
   3:     base.OnNavigatedFrom(e);
   4:     //離開前如果已經存在就把它隱藏
   5:     if (gUCAdpControl != null) gUCAdpControl.HideProgress();
   6: }

              3.2.3. OnNavigatedTo():回到畫面時,把廣告元件重新顯示

   1: protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
   2: {
   3:     base.OnNavigatedTo(e);
   4:     //進入後如果已經存在就把它顯示
   5:     if (gUCAdpControl != null) gUCAdpControl.ShowAdpControl();    
   6: }

 

 

 

[補充]

〉如果您是使用WP 7.1 SDK開發,想增加MS的廣告元件,遇到跑不出來問題時,可參考以下的解法:

    1. 建議在動態加入廣告時,在OnNavigatedTo()時加入比較好;記得指定CountryOrRegion為US;如下程式碼:

protected override void OnNavigatedTo(NavigationEventArgs e)
 {
        base.OnNavigatedTo(e);
 
        AdControl adControl = new AdControl(progid, adid, true);
        adControl.Width = 480;
        adControl.Height = 80;
        adControl.Name = "testad";
        adControl.CountryOrRegion = "US";
        AdBanner.Children.Add(adControl);
 }

 

〉如果採用WP 8開發,增加MS廣告跑不出來時,可參考以下解法:

1. 確認是否加上必要的capabilities:ID_CAP_PHONEDIALER, ID_CAP_IDENTITY_USER, ID_CAP_MEDIALIB

    由於在WP 8沒有MEDIALIB這個字串,所以就把所有相關MEDIALIB的全加入,如下:

 <Capability Name="ID_CAP_PHONEDIALER" />
 <Capability Name="ID_CAP_IDENTITY_USER" />
 <Capability Name="ID_CAP_MEDIALIB_PLAYBACK" />
 <Capability Name="ID_CAP_MEDIALIB_PHOTO" />
 <Capability Name="ID_CAP_MEDIALIB_AUDIO" />

 

2. 依舊建議同WP 7.1的做法,可在OnNavigatedTo()再動態加入,並設定CountryOrRegion = "US";

 

3. WP 8針對MSAdvertising使用的dll與WP 7.1不同,所以請確認專案裡是否使用了對的dll,如下:

    ‧C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v8.0\ExtensionSDKs\MSAdvertising\6.1 References\CommonConfiguration\neutral\Microsoft.Advertising.Mobile.dll

    ‧C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v8.0\ExtensionSDKs\MSAdvertising\6.1\References\CommonConfiguration\neutral\microsoft.advertising.mobile.ui.dll
 

======

以上是分享使用Advertising SDK的心得,如果在其他使用上還有什麼新發現,將會在補充上來,

如果各位有遇到問題,也希望可以留言或mail來互相交流。謝謝。

 

Dotblogs Tags: