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來互相交流。謝謝。