Quảng cáo khi mở ứng dụng

Quảng cáo khi mở ứng dụng là một định dạng quảng cáo đặc biệt dành cho những nhà xuất bản muốn kiếm tiền từ màn hình tải ứng dụng của họ. Quảng cáo khi mở ứng dụng được thiết kế để hiển thị khi người dùng đưa ứng dụng của bạn lên nền trước và họ có thể đóng quảng cáo này bất cứ lúc nào.

Quảng cáo khi mở ứng dụng tự động hiển thị một vùng nhỏ chứa thông tin thương hiệu để người dùng biết họ đang mở ứng dụng của bạn. Dưới đây là một ví dụ về cách hiển thị của quảng cáo khi mở ứng dụng:

Điều kiện tiên quyết

  • Trình bổ trợ Unity phiên bản 6.1.0 trở lên.
  • Hoàn thành các bước Bắt đầu sử dụng. Ứng dụng Unity của bạn phải nhập sẵn trình bổ trợ Unity quảng cáo trên thiết bị di động của Google.

Luôn kiểm tra bằng quảng cáo thử nghiệm

Khi tạo và thử nghiệm ứng dụng, hãy đảm bảo rằng bạn sử dụng quảng cáo thử nghiệm thay vì quảng cáo đang chạy thực tế. Chúng tôi sẽ tạm ngưng tài khoản của bạn nếu bạn không thực hiện việc này.

Cách dễ nhất để tải quảng cáo thử nghiệm là sử dụng ID đơn vị quảng cáo thử nghiệm dành riêng cho quảng cáo có tặng thưởng trên Android và iOS:

Android

ca-app-pub-3940256099942544/3419835294

iOS

ca-app-pub-3940256099942544/5662855259

Các ID này đã được định cấu hình đặc biệt để trả về quảng cáo thử nghiệm cho mọi yêu cầu và bạn có thể sử dụng chúng trong các ứng dụng của mình khi viết mã, thử nghiệm và gỡ lỗi. Bạn chỉ cần nhớ thay thế mã này bằng mã đơn vị quảng cáo của mình trước khi xuất bản ứng dụng.

Để biết thêm thông tin về cách hoạt động của quảng cáo thử nghiệm của SDK quảng cáo trên thiết bị di động, hãy xem bài viết về Quảng cáo thử nghiệm.

Cách thức triển khai

Các bước chính để tích hợp quảng cáo khi mở ứng dụng là:

  1. Tạo một lớp tiện ích sẽ tải quảng cáo trước khi bạn cần hiển thị quảng cáo đó.
  2. Tải một quảng cáo.
  3. Đăng ký các lệnh gọi lại và hiển thị quảng cáo.
  4. Theo dõi MonoBehavior.OnApplicationPause(bool) để hiển thị quảng cáo trong các sự kiện đưa lên nền trước.

Tạo một lớp tiện ích

Tạo một lớp mới có tên là AppOpenAdManager để tải quảng cáo. Lớp này sẽ quản lý một biến thực thể để theo dõi một quảng cáo đã tải và mã đơn vị quảng cáo cho từng nền tảng.

using System;
using GoogleMobileAds.Api;
using UnityEngine;

public class AppOpenAdManager
{
    #if UNITY_ANDROID
    private const string AD_UNIT_ID = "ca-app-pub-3940256099942544/3419835294";
    #elif UNITY_IOS
    private const string AD_UNIT_ID = "ca-app-pub-3940256099942544/5662855259";
    #else
    private const string AD_UNIT_ID = "unexpected_platform";
    #endif

    private static AppOpenAdManager instance;

    private AppOpenAd ad;

    private bool isShowingAd = false;

    public static AppOpenAdManager Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new AppOpenAdManager();
            }

            return instance;
        }
    }

    private bool IsAdAvailable
    {
        get
        {
            return ad != null;
        }
    }

    public void LoadAd()
    {
        // We will implement this below.
    }
}

Tải một quảng cáo

Bạn phải chuẩn bị sẵn quảng cáo khi mở ứng dụng trước khi người dùng mở ứng dụng của bạn. Hãy triển khai một lớp tiện ích để thực hiện các yêu cầu quảng cáo trước khi bạn cần hiển thị quảng cáo.

Bạn có thể tải một quảng cáo bằng cách sử dụng phương thức LoadAd() tĩnh trên lớp AppOpenAd. Phương thức tải này yêu cầu một mã đơn vị quảng cáo, một chế độ ScreenOrientation, một đối tượng AdRequest và một trình xử lý hoàn thành để gọi khi tải quảng cáo thành công hoặc không thành công. Đối tượng AppOpenAd đã tải được cung cấp dưới dạng một thông số trong trình xử lý hoàn thành. Dưới đây là ví dụ về cách tải một AppOpenAd.

public class AppOpenAdManager
{
    ...

    public void LoadAd()
    {
        AdRequest request = new AdRequest.Builder().Build();

        // Load an app open ad for portrait orientation
        AppOpenAd.LoadAd(AD_UNIT_ID, ScreenOrientation.Portrait, request, ((appOpenAd, error) =>
        {
            if (error != null)
            {
                // Handle the error.
                Debug.LogFormat("Failed to load the ad. (reason: {0})", error.LoadAdError.GetMessage());
                return;
            }

            // App open ad is loaded.
            ad = appOpenAd;
        }));
    }
}

Hiển thị quảng cáo và xử lý các lệnh gọi lại toàn màn hình

Trước khi hiển thị quảng cáo, hãy đăng ký ủy quyền cho từng trình xử lý sự kiện để theo dõi từng sự kiện quảng cáo.

public class AppOpenAdManager
{
    ...

    public void ShowAdIfAvailable()
    {
        if (!IsAdAvailable || isShowingAd)
        {
            return;
        }

        ad.OnAdDidDismissFullScreenContent += HandleAdDidDismissFullScreenContent;
        ad.OnAdFailedToPresentFullScreenContent += HandleAdFailedToPresentFullScreenContent;
        ad.OnAdDidPresentFullScreenContent += HandleAdDidPresentFullScreenContent;
        ad.OnAdDidRecordImpression += HandleAdDidRecordImpression;
        ad.OnPaidEvent += HandlePaidEvent;

        ad.Show();
    }

    private void HandleAdDidDismissFullScreenContent(object sender, EventArgs args)
    {
        Debug.Log("Closed app open ad");
        // Set the ad to null to indicate that AppOpenAdManager no longer has another ad to show.
        ad = null;
        isShowingAd = false;
        LoadAd();
    }

    private void HandleAdFailedToPresentFullScreenContent(object sender, AdErrorEventArgs args)
    {
        Debug.LogFormat("Failed to present the ad (reason: {0})", args.AdError.GetMessage());
        // Set the ad to null to indicate that AppOpenAdManager no longer has another ad to show.
        ad = null;
        LoadAd();
    }

    private void HandleAdDidPresentFullScreenContent(object sender, EventArgs args)
    {
        Debug.Log("Displayed app open ad");
        isShowingAd = true;
    }

    private void HandleAdDidRecordImpression(object sender, EventArgs args)
    {
        Debug.Log("Recorded ad impression");
    }

    private void HandlePaidEvent(object sender, AdValueEventArgs args)
    {
        Debug.LogFormat("Received paid event. (currency: {0}, value: {1}",
                args.AdValue.CurrencyCode, args.AdValue.Value);
    }
}

Nếu người dùng quay lại ứng dụng của bạn sau khi rời khỏi bằng cách nhấp vào một quảng cáo khi mở ứng dụng, thì hãy đảm bảo rằng ứng dụng đó không hiển thị một quảng cáo khi mở ứng dụng khác cho người dùng.

Theo dõi các sự kiện đưa ứng dụng lên nền trước

Để được thông báo về các sự kiện đưa ứng dụng lên nền trước, bạn cần phải theo dõi thông báo tạm dừng ứng dụng. Bằng cách triển khai phương thức MonoBehavior.OnApplicationPause(bool), ứng dụng của bạn sẽ được thông báo về các sự kiện chạy ứng dụng và đưa ứng dụng lên nền trước, đồng thời có thể hiển thị quảng cáo.

using UnityEngine;

using GoogleMobileAds.Api;

public class GoogleMobileAdsDemoScript : MonoBehaviour
{

    public void Start()
    {
        // Load an app open ad when the scene starts
        AppOpenAdManager.Instance.LoadAd();
    }

    public void OnApplicationPause(bool paused)
    {
        // Display the app open ad when the app is foregrounded
        if (!paused)
        {
            AppOpenAdManager.Instance.ShowAdIfAvailable();
        }
    }
}

Xem xét thời hạn quảng cáo

Để đảm bảo bạn không hiển thị quảng cáo đã hết hạn, hãy thêm một phương thức vào AppOpenAdManager nhằm kiểm tra thời lượng kể từ khi quảng cáo của bạn được tải. Tiếp theo, hãy sử dụng phương thức đó để kiểm tra xem liệu quảng cáo có còn hợp lệ hay không.

public class AppOpenAdManager
{
    ...
    private DateTime loadTime;

    private bool IsAdAvailable
    {
        get
        {
            return ad != null && (System.DateTime.UtcNow - loadTime).TotalHours < 4;
        }
    }

    public void LoadAd()
    {
        if (IsAdAvailable)
        {
            return;
        }

        AdRequest request = new AdRequest.Builder().Build();
        AppOpenAd.LoadAd(AD_UNIT_ID, ScreenOrientation.Portrait, request, ((appOpenAd, error) =>
        {
            if (error != null)
            {
                Debug.LogFormat("Failed to load the ad. (reason: {0})", error.LoadAdError.GetMessage());
                return;
            }

            ad = appOpenAd;
            loadTime = DateTime.UtcNow;
        }));
    }
}

Khởi động nguội và màn hình tải

Từ đầu đến giờ, tài liệu này giả định rằng bạn chỉ hiển thị quảng cáo khi mở ứng dụng vào lúc người dùng đưa ứng dụng của bạn lên nền trước khi ứng dụng bị tạm ngưng trong bộ nhớ. "Khởi động nguội" xảy ra khi người dùng chạy ứng dụng của bạn nhưng trước đó, ứng dụng không bị tạm ngưng trong bộ nhớ.

Một ví dụ về khởi động nguội là khi người dùng mở ứng dụng của bạn lần đầu tiên. Trong trường hợp khởi động nguội, quảng cáo khi mở ứng dụng chưa được tải trước lần nào nên chưa sẵn sàng để hiển thị ngay lập tức. Một tình huống có thể xảy ra trong khoảng thời gian từ khi bạn yêu cầu quảng cáo cho đến khi nhận được quảng cáo (gọi là độ trễ), đó là người dùng vừa mới sử dụng ứng dụng của bạn trong chốc lát thì một quảng cáo không phù hợp đột ngột xuất hiện khiến họ bị bất ngờ. Bạn nên tránh làm như vậy vì điều này sẽ tạo ra trải nghiệm kém cho người dùng.

Nếu dùng quảng cáo khi mở ứng dụng vào lúc khởi động nguội, thì bạn nên dùng màn hình tải để tải các tài sản của trò chơi hoặc ứng dụng đó. Đồng thời, bạn chỉ nên hiển thị quảng cáo từ màn hình tải. Bạn đừng hiển thị quảng cáo nếu ứng dụng đã tải xong và đã đưa người dùng đến nội dung chính của ứng dụng.

Các phương pháp hay nhất

Quảng cáo khi mở ứng dụng giúp bạn kiếm tiền từ màn hình tải của ứng dụng, khi ứng dụng chạy lần đầu và khi chuyển đổi ứng dụng. Tuy nhiên, bạn cần ghi nhớ các phương pháp hay nhất để làm cho người dùng thích sử dụng ứng dụng của bạn. Tốt nhất là bạn nên:

  • Hiển thị quảng cáo khi mở ứng dụng đầu tiên sau khi người dùng đã sử dụng ứng dụng của bạn vài lần.
  • Hiển thị quảng cáo khi mở ứng dụng trong thời gian người dùng chờ ứng dụng của bạn tải.
  • Nếu bạn có màn hình tải trong quảng cáo khi mở ứng dụng và màn hình tải đó đã tải xong trước khi quảng cáo bị đóng, thì bạn có thể đóng màn hình tải trong trình xử lý sự kiện OnAdDidDismissFullScreenContent.