Ads Mediation – không cần SDK của bên thứ 3

Hi mọi người, hiện tại một số Ads SDK đã tích hợp Mediation giúp dev dễ dàng hơn trong việc mediation mà không cần phải code nhiều. Nhưng việc đó giảm đi sự tối ưu theo ý kiến của một số dev có kinh nghiệm.

Bài viết này sẽ giúp các bạn mediation kết hợp các ads network khác nhau để được thu nhập tối ưu và đúng kỹ thuật theo kinh nghiệm của tác giả. Hiện tại 2 ads network có fillrate tốt cho Windows Phone là: pubCenterAdmob (bạn có thể thêm Amobi, Vserv,… theo sau với cách tương tự). Nếu là app, game global user thì thứ tự này là tối ưu nhất cho banner (theo số liệu pubCenter có eCPM trung bình 0.3$, Admob banner có eCPM trung bình 0.05$).

Các bước thật ra chỉ là bắt Fail hoặc NoFill event (không có ads trả về) của các SDK để load Ads khác thay thế. Từ đó giúp tối ưu được doanh thu (thường gọi là tận thu 😀 ) nghĩa là có thể lúc nào cũng sẽ có ads được load lên ứng dụng.

Code đơn giản như sau:


void Add_Pubcenter()
{
    Deployment.Current.Dispatcher.BeginInvoke(() =>
    {
        adsGrid.Visibility = System.Windows.Visibility.Visible;
        if (adsGrid.Children.Count > 0)
        {
            if (adsGrid.Children[0] is AdControl)
                (adsGrid.Children[0] as AdControl).ErrorOccurred -= ad_ErrorOccurred;
            else
                (adsGrid.Children[0] as AdView).FailedToReceiveAd -= adView_FailedToReceiveAd;
        }
        adsGrid.Children.Clear();
        AdControl ad = new AdControl(CurrentApp.AppId.ToString(), "xxxxxx", true);
        ad.Height = 80; ad.Width = 480;
        ad.ErrorOccurred += ad_ErrorOccurred;
        adsGrid.Children.Add(ad);
    });
}
void ad_ErrorOccurred(object sender, Microsoft.Advertising.AdErrorEventArgs e)
{
    Deployment.Current.Dispatcher.BeginInvoke(() =>
    {
        (sender as AdControl).ErrorOccurred -= ad_ErrorOccurred;
        adsGrid.Children.Clear();
        Add_Admob_Banner();
    });
}
void Add_Admob_Banner()
{
    Deployment.Current.Dispatcher.BeginInvoke(() =>
    {
        AdView adView = new AdView
        {
            Format = AdFormats.Banner,
            AdUnitID = "ca-app-pub-xxxxxxxxxxxxx/yyyyyyyy",
            VerticalAlignment = System.Windows.VerticalAlignment.Bottom,
        };
        adView.FailedToReceiveAd += adView_FailedToReceiveAd;
        adsGrid.Children.Add(adView);
        AdRequest adRequest = new AdRequest();
        adView.LoadAd(adRequest);
    });
}
void adView_FailedToReceiveAd(object sender, AdErrorEventArgs e)
{
    Deployment.Current.Dispatcher.BeginInvoke(() =>
    {
        (sender as AdView).FailedToReceiveAd -= adView_FailedToReceiveAd;
        adsGrid.Children.Clear();
        adsGrid.Visibility = System.Windows.Visibility.Collapsed;
    });
}

Gọi hàm Add_Pubcenter trong Loaded event của page muốn hiện, trong đó adsGrid là Grid trên XAML của page đó và có chiều cao 80 để hiển thị ads.

Vì load ads bằng code behind nên phải dùng BeginInvoke (liên quan đến UI thread mọi người có thể tìm hiểu thêm, nếu không dùng BeginInvoke thì game dễ bị crash nếu 2 thread cùng tương tác UI).

Mỗi khi xóa ads khỏi Grid thì remove event handler đi với toán tử “-=” như trên để giải phóng bộ nhớ và tránh thực thi nhiều lần dù ads object đã bị clear khỏi Grid nhé.

Nhớ thay thế các ads ID của bạn vào :>

Chúc các bạn thành công!

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s