Tài liệu hướng dẫn này dành cho các nhà xuất bản muốn tích hợp 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ọ. Người dùng có thể đóng quảng cáo khi mở ứng dụng bất cứ lúc nào. Quảng cáo khi mở ứng dụng có thể xuất hiện khi người dùng chạy ứng dụng của bạn trên nền trước.
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:
Cụ thể hơn, dưới đây là các bước bắt buộc để triển khai quảng cáo khi mở ứng dụng:
- Tạo một lớp trình quản lý sẽ tải quảng cáo trước khi bạn cần hiển thị quảng cáo đó.
- Hiển thị quảng cáo trong các sự kiện đưa ứng dụng lên nền trước.
- Xử lý lệnh gọi lại bản trình bày.
Điều kiện tiên quyết
- Làm theo các hướng dẫn thiết lập trong Hướng dẫn bắt đầu.
- Tìm hiểu cách định cấu hình thiết bị của bạn làm thiết bị thử nghiệm.
Luôn thử nghiệm bằng quảng cáo thử nghiệm
Khi bạn tạo và thử nghiệm ứng dụng, hãy nhớ sử dụng quảng cáo thử nghiệm thay vì quảng cáo đang chạy trong thực tế. Chúng tôi có thể tạm ngưng tài khoản của bạn nếu bạn không làm như vậy.
Cách dễ nhất để tải quảng cáo thử nghiệm là dùng mã đơn vị quảng cáo thử nghiệm chúng tôi dành riêng cho quảng cáo khi mở ứng dụng:
ca-app-pub-3940256099942544/5575463023
Mã 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 mã này trong ứng dụng của mình khi lập trình, chạy 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 Quảng cáo thử nghiệm.
Triển khai một lớp trình quản lý
Quảng cáo của bạn cần phải nhanh chóng hiển thị. Do đó, tốt nhất là bạn nên tải quảng cáo trước khi cần hiển thị quảng cáo. Khi bạn làm như vậy, quảng cáo sẽ sẵn sàng hoạt động ngay khi người dùng truy cập vào ứng dụng của bạn. Hãy triển khai một lớp trình quản lý để 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.
Tạo một lớp singleton mới có tên là AppOpenAdManager
:
Swift
class AppOpenAdManager: NSObject {
/// The app open ad.
var appOpenAd: AppOpenAd?
/// Maintains a reference to the delegate.
weak var appOpenAdManagerDelegate: AppOpenAdManagerDelegate?
/// Keeps track of if an app open ad is loading.
var isLoadingAd = false
/// Keeps track of if an app open ad is showing.
var isShowingAd = false
/// Keeps track of the time when an app open ad was loaded to discard expired ad.
var loadTime: Date?
/// For more interval details, see https://support.google.com/admob/answer/9341964
let timeoutInterval: TimeInterval = 4 * 3_600
static let shared = AppOpenAdManager()
Objective-C
@interface AppOpenAdManager ()
/// The app open ad.
@property(nonatomic, strong, nullable) GADAppOpenAd *appOpenAd;
/// Keeps track of if an app open ad is loading.
@property(nonatomic, assign) BOOL isLoadingAd;
/// Keeps track of if an app open ad is showing.
@property(nonatomic, assign) BOOL isShowingAd;
/// Keeps track of the time when an app open ad was loaded to discard expired ad.
@property(nonatomic, strong, nullable) NSDate *loadTime;
@end
/// For more interval details, see https://support.google.com/admob/answer/9341964
static const NSInteger kTimeoutInterval = 4;
@implementation AppOpenAdManager
+ (nonnull AppOpenAdManager *)sharedInstance {
static AppOpenAdManager *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[AppOpenAdManager alloc] init];
});
return instance;
}
Và triển khai giao thức AppOpenAdManagerDelegate
của nó:
Swift
protocol AppOpenAdManagerDelegate: AnyObject {
/// Method to be invoked when an app open ad life cycle is complete (i.e. dismissed or fails to
/// show).
func appOpenAdManagerAdDidComplete(_ appOpenAdManager: AppOpenAdManager)
}
Objective-C
@protocol AppOpenAdManagerDelegate <NSObject>
/// Method to be invoked when an app open ad life cycle is complete (i.e. dismissed or fails to
/// show).
- (void)adDidComplete;
@end
Tải một quảng cáo
Bước tiếp theo là tải quảng cáo khi mở ứng dụng:
Swift
func loadAd() async {
// Do not load ad if there is an unused ad or one is already loading.
if isLoadingAd || isAdAvailable() {
return
}
isLoadingAd = true
do {
appOpenAd = try await AppOpenAd.load(
with: "ca-app-pub-3940256099942544/5575463023", request: Request())
appOpenAd?.fullScreenContentDelegate = self
loadTime = Date()
} catch {
print("App open ad failed to load with error: \(error.localizedDescription)")
appOpenAd = nil
loadTime = nil
}
isLoadingAd = false
}
Objective-C
- (void)loadAd {
// Do not load ad if there is an unused ad or one is already loading.
if ([self isAdAvailable] || self.isLoadingAd) {
return;
}
self.isLoadingAd = YES;
[GADAppOpenAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/5575463023"
request:[GADRequest request]
completionHandler:^(GADAppOpenAd * _Nullable appOpenAd, NSError * _Nullable error) {
self.isLoadingAd = NO;
if (error) {
NSLog(@"App open ad failed to load with error: %@", error);
self.appOpenAd = nil;
self.loadTime = nil;
return;
}
self.appOpenAd = appOpenAd;
self.appOpenAd.fullScreenContentDelegate = self;
self.loadTime = [NSDate date];
}];
}
Hiển thị quảng cáo
Bước tiếp theo là hiển thị quảng cáo khi mở ứng dụng. Nếu không có quảng cáo, hãy thử tải một quảng cáo mới.
Swift
func showAdIfAvailable() {
// If the app open ad is already showing, do not show the ad again.
if isShowingAd {
return print("App open ad is already showing.")
}
// If the app open ad is not available yet but is supposed to show, load
// a new ad.
if !isAdAvailable() {
print("App open ad is not ready yet.")
// The app open ad is considered to be complete in this example.
appOpenAdManagerDelegate?.appOpenAdManagerAdDidComplete(self)
// Load a new ad.
return
}
if let appOpenAd {
appOpenAd.present(from: nil)
isShowingAd = true
}
}
Objective-C
- (void)showAdIfAvailable {
// If the app open ad is already showing, do not show the ad again.
if (self.isShowingAd) {
NSLog(@"App open ad is already showing.");
return;
}
// If the app open ad is not available yet but is supposed to show, load
// a new ad.
if (![self isAdAvailable]) {
NSLog(@"App open ad is not ready yet.");
// The app open ad is considered to be complete in this example.
[self adDidComplete];
// Load a new ad.
return;
}
[self.appOpenAd presentFromRootViewController:nil];
self.isShowingAd = YES;
}
Hiển thị quảng cáo trong các sự kiện đưa ứng dụng lên nền trước
Khi ứng dụng trở nên hoạt động, hãy gọi showAdIfAvailable()
để hiển thị quảng cáo nếu có hoặc tải một quảng cáo mới.
Swift
func applicationDidBecomeActive(_ application: UIApplication) {
// Show the app open ad when the app is foregrounded.
AppOpenAdManager.shared.showAdIfAvailable()
}
Objective-C
- (void) applicationDidBecomeActive:(UIApplication *)application {
// Show the app open ad when the app is foregrounded.
[AppOpenAdManager.sharedInstance showAdIfAvailable];
}
Xử lý lệnh gọi lại bản trình bày
Để nhận thông báo cho các sự kiện trình bày, bạn phải chỉ định GADFullScreenContentDelegate
cho thuộc tính fullScreenContentDelegate của quảng cáo được trả về:
Swift
appOpenAd?.fullScreenContentDelegate = self
Objective-C
self.appOpenAd.fullScreenContentDelegate = self;
Cụ thể, bạn sẽ muốn yêu cầu quảng cáo khi mở ứng dụng tiếp theo khi quảng cáo đầu tiên hiển thị xong. Đoạn mã sau đây cho biết cách triển khai giao thức trong tệp AppOpenAdManager
:
Swift
func adDidRecordImpression(_ ad: FullScreenPresentingAd) {
print("App open ad recorded an impression.")
}
func adDidRecordClick(_ ad: FullScreenPresentingAd) {
print("App open ad recorded a click.")
}
func adWillDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
print("App open ad will be dismissed.")
}
func adWillPresentFullScreenContent(_ ad: FullScreenPresentingAd) {
print("App open ad will be presented.")
}
func adDidDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
print("App open ad was dismissed.")
appOpenAd = nil
isShowingAd = false
appOpenAdManagerDelegate?.appOpenAdManagerAdDidComplete(self)
Task {
await loadAd()
}
}
func ad(
_ ad: FullScreenPresentingAd,
didFailToPresentFullScreenContentWithError error: Error
) {
print("App open ad failed to present with error: \(error.localizedDescription)")
appOpenAd = nil
isShowingAd = false
appOpenAdManagerDelegate?.appOpenAdManagerAdDidComplete(self)
Task {
await loadAd()
}
}
Objective-C
- (void)adDidRecordImpression:(nonnull id<GADFullScreenPresentingAd>)ad {
NSLog(@"App open ad recorded an impression.");
}
- (void)adDidRecordClick:(nonnull id<GADFullScreenPresentingAd>)ad {
NSLog(@"App open ad recorded a click.");
}
- (void)adWillPresentFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
NSLog(@"App open ad will be presented.");
}
- (void)adWillDismissFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
NSLog(@"App open ad will be dismissed.");
}
- (void)adDidDismissFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
NSLog(@"App open ad was dismissed.");
self.appOpenAd = nil;
self.isShowingAd = NO;
[self adDidComplete];
[self loadAd];
}
- (void)ad:(nonnull id<GADFullScreenPresentingAd>)ad
didFailToPresentFullScreenContentWithError:(nonnull NSError *)error {
NSLog(@"App open ad failed to present with error: %@", error.localizedDescription);
self.appOpenAd = nil;
self.isShowingAd = NO;
[self adDidComplete];
[self loadAd];
}
Xem xét thời hạn của quảng cáo
Để đảm bảo không hiển thị quảng cáo đã hết hạn, bạn có thể thêm một phương thức vào thực thể đại diện cho ứng dụng để kiểm tra khoảng thời gian kể từ khi tệp đối chiếu quảng cáo của bạn được tải.
Trong AppOpenAdManager
, hãy thêm một thuộc tính Date
có tên là loadTime
và đặt thuộc tính khi quảng cáo của bạn tải. Sau đó, bạn có thể thêm một phương thức trả về true
nếu số giờ trôi qua kể từ khi quảng cáo của bạn được tải thấp hơn một mức nhất định. Hãy nhớ kiểm tra tính hợp lệ của tệp tham chiếu quảng cáo trước khi bạn cố gắng hiển thị quảng cáo.
Swift
private func wasLoadTimeLessThanNHoursAgo(timeoutInterval: TimeInterval) -> Bool {
// Check if ad was loaded more than n hours ago.
if let loadTime = loadTime {
return Date().timeIntervalSince(loadTime) < timeoutInterval
}
return false
}
private func isAdAvailable() -> Bool {
// Check if ad exists and can be shown.
return appOpenAd != nil && wasLoadTimeLessThanNHoursAgo(timeoutInterval: timeoutInterval)
}
Objective-C
- (BOOL)wasLoadTimeLessThanNHoursAgo:(int)n {
// Check if ad was loaded more than n hours ago.
NSDate *now = [NSDate date];
NSTimeInterval timeIntervalBetweenNowAndLoadTime = [now timeIntervalSinceDate:self.loadTime];
double secondsPerHour = 3600.0;
double intervalInHours = timeIntervalBetweenNowAndLoadTime / secondsPerHour;
return intervalInHours < n;
}
- (BOOL)isAdAvailable {
// Check if ad exists and can be shown.
return _appOpenAd && [self wasLoadTimeLessThanNHoursAgo:kTimeoutInterval];
}
Khởi động nguội và màn hình tải
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 tại thời điểm người dùng đưa ứng dụng của bạn lên nền trước khi ứng dụng đang tạm ngưng trong bộ nhớ. Quy trì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. Độ trễ giữa thời điểm bạn yêu cầu quảng cáo và thời điểm nhận được quảng cáo có thể tạo ra tình huống người dùng có thể sử dụng ứng dụng của bạn trong thời gian ngắn trước khi bị bất ngờ bởi một quảng cáo không phù hợp. 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.
Để sử dụng quảng cáo khi mở ứng dụng vào lúc khởi động nguội, cách tốt nhất là bạn nên dùng màn hình tải để tải các thành phần trò chơi hoặc ứng dụng và chỉ nên hiển thị quảng cáo trên 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
Google tạo 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, nhưng bạn nên áp dụng các phương pháp hay nhất để người dùng hài lòng khi sử dụng ứng dụng của bạn. Hãy nhớ:
- Chờ người dùng sử dụng ứng dụng của bạn vài lần rồi mới hiển thị quảng cáo khi mở ứng dụng đầu tiê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 nên
đóng màn hình tải theo phương thức
adDidDismissFullScreenContent
.
Ví dụ hoàn chỉnh trên GitHub
Các bước tiếp theo
Tìm hiểu thêm về quyền riêng tư của người dùng.