این راهنما برای ناشرانی است که آگهیهای باز برنامه را یکپارچهسازی میکنند.
آگهیهای باز کردن برنامه قالب آگهی ویژهای است که برای ناشرانی درنظر گرفته شده است که میخواهند از صفحههای بار کردن برنامه خود درآمدزایی کنند. کاربران شما میتوانند هرزمان بخواهند آگهیهای باز کردن برنامه را ببندند. آگهیهای باز کردن برنامه میتوانند زمانی که کاربران برنامه شما را به پیشزمینه میآورند نمایش داده شوند.
آگهیهای باز کردن برنامه بهطور خودکار یک ناحیه نمانام کوچک نشان میدهند تا کاربران بدانند در برنامه شما هستند. در اینجا نمونهای از ظاهر آگهی باز کردن برنامه آورده شده است:

در سطح بالا، مراحل لازم برای پیادهسازی آگهیهای باز کردن برنامه در اینجا آمده است:
- کلاس مدیری ایجاد کنید که آگهی را قبلاز اینکه نیاز به نمایش آن داشته باشید بار میکند.
- تبلیغ درطول رویدادهای پیشنمایش برنامه نمایش داده شود.
- مدیریت کردن برگشتیهای ارائه.
پیشنیازها
- Google Mobile Ads SDK را راهاندازی کنید.
- با نحوه پیکربندی دستگاه بهعنوان دستگاه آزمایشی آشنا باشید.
همیشه با آگهیهای آزمایشی آزمایش کنید
هنگام ساختن و آزمایش کردن برنامههایتان، مطمئن شوید که از آگهیهای آزمایشی بهجای آگهیهای زنده و تولید استفاده میکنید. انجام ندادن این کار میتواند منجر به تعلیق حساب شما شود.
آسانترین راه برای بار کردن آگهیهای آزمایشی استفاده از شناسه واحد آگهی آزمایشی اختصاصی ما برای آگهیهای باز کردن برنامه است:
ca-app-pub-3940256099942544/5575463023
این واحد آگهی بهطور ویژه پیکربندی شده است تا برای هر درخواست آگهی آزمایشی برگرداند، و شما میتوانید درحین کدنویسی، آزمایش، و اشکالزدایی در برنامههای خودتان از آن استفاده کنید. فقط مطمئن شوید که قبلاز انتشار برنامه، آن را با شناسه واحد آگهی خودتان جایگزین کنید.
برای اطلاعات بیشتر درباره نحوه عملکرد آگهیهای آزمایشی Google Mobile Ads SDK، به آگهیهای آزمایشی مراجعه کنید.
پیادهسازی کلاس مدیر
آگهیتان باید سریع نشان داده شود، بنابراین بهتر است آگهیتان را قبلاز اینکه نیاز به نمایش آن داشته باشید بار کنید. به این ترتیب، بهمحض اینکه کاربر وارد برنامهتان شد، آگهی آمادهای خواهید داشت. کلاس مدیری را پیادهسازی کنید تا درخواستهای آگهی را پیشاز زمانی که باید آگهی را نشان دهید انجام دهد.
کلاس تکنمونه جدیدی بهنام 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()
آبجکتیو-سی
@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;
}
و پروتکل AppOpenAdManagerDelegate آن را پیادهسازی کنید:
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)
}
آبجکتیو-سی
@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
بار کردن آگهی
مرحله بعدی بار کردن آگهی باز برنامه است:
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
}
آبجکتیو-سی
- (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];
}];
}
نمایش آگهی
مرحله بعدی نمایش آگهی باز برنامه است. اگر آگهی دردسترس نباشد، تلاش کنید آگهی جدیدی بار کنید.
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
}
}
آبجکتیو-سی
- (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;
}
آگهی درطول رویدادهای پیشزمینهای برنامه نمایش داده شود
وقتی برنامه فعال میشود، اگر آگهی دردسترس باشد، با showAdIfAvailable() تماس بگیرید تا آگهی نشان داده شود، یا آگهی جدیدی بار کنید.
Swift
func applicationDidBecomeActive(_ application: UIApplication) {
// Show the app open ad when the app is foregrounded.
AppOpenAdManager.shared.showAdIfAvailable()
}
آبجکتیو-سی
- (void) applicationDidBecomeActive:(UIApplication *)application {
// Show the app open ad when the app is foregrounded.
[AppOpenAdManager.sharedInstance showAdIfAvailable];
}
مدیریت کردن برگشتیهای ارائه
برای دریافت اعلانهای رویدادهای ارائه، باید
GADFullScreenContentDelegate را به دارایی fullScreenContentDelegate آگهی برگشتی
اختصاص دهید:
Swift
appOpenAd?.fullScreenContentDelegate = self
آبجکتیو-سی
self.appOpenAd.fullScreenContentDelegate = self;
بهطور خاص، وقتی اولین آگهی باز برنامه نمایشش تمام شد، باید آگهی باز برنامه بعدی را درخواست کنید. کد زیر نحوه پیادهسازی پروتکل را
در فایل 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()
}
}
آبجکتیو-سی
- (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];
}
انقضای آگهی را درنظر بگیرید
برای اینکه مطمئن شوید آگهی منقضیشدهای را نشان نمیدهید، میتوانید روشی به نماینده برنامه اضافه کنید که زمان سپریشده از بار شدن مرجع آگهیتان را بررسی کند.
در AppOpenAdManager خودتان، دارایی Date بهنام loadTime اضافه کنید و
دارایی را هنگام بار شدن آگهیتان تنظیم کنید. سپس میتوانید روشی اضافه کنید که اگر کمتر از تعداد مشخصی ساعت از زمان بار شدن آگهیتان گذشته باشد، true برگرداند. قبلاز اینکه بخواهید آگهی را نشان دهید، حتماً
معتبر بودن مرجع آگهیتان را بررسی کنید.
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)
}
آبجکتیو-سی
- (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];
}
شروع سرد و صفحههای بار کردن
این سند فرض میکند که شما فقط زمانی آگهیهای باز کردن برنامه را نمایش میدهید که کاربران برنامهتان را وقتی در حافظه تعلیق شده است به پیشزمینه میآورند. «شروعهای سرد» زمانی رخ میدهد که برنامه شما راهاندازی میشود اما قبلاً در حافظه تعلیق نشده است.
مثالی از راهاندازی سرد زمانی است که کاربر برای اولینبار برنامه شما را باز میکند. با شروعهای سرد، آگهی باز برنامه ازقبل بارگیریشدهای نخواهید داشت که آماده نمایش فوری باشد. تأخیر بین زمانی که آگهی درخواست میکنید و زمانی که آگهی را دریافت میکنید میتواند وضعیتی ایجاد کند که کاربران بتوانند قبلاز اینکه با آگهی خارج از زمینهای غافلگیر شوند، بهطور خلاصه از برنامه شما استفاده کنند. باید از این کار اجتناب شود زیرا تجربه کاربری بدی است.
روش ترجیحی برای استفاده از آگهیهای باز کردن برنامه در شروعهای سرد این است که از صفحه بارگیری برای بار کردن داراییهای بازی یا برنامه استفاده کنید و آگهی را فقط از صفحه بارگیری نشان دهید. اگر برنامه شما بارگیری را تکمیل کرده است و کاربر را به محتوای اصلی برنامه شما هدایت کرده است، آگهی را نشان ندهید.
روالهای مطلوب
Google آگهیهای باز کردن برنامه را ساخته است تا به شما کمک کند از صفحه بارگیری برنامهتان درآمدزایی کنید، اما مهم است که شیوههای مطلوب را بهخاطر داشته باشید تا کاربران از استفاده از برنامهتان لذت ببرند. حتماً:
- صبر کنید تا کاربران چند بار از برنامهتان استفاده کنند، سپس آگهی باز شدن برنامه اول را نشان دهید.
- آگهیهای باز کردن برنامه را در زمانهایی نمایش دهید که کاربران شما درغیراینصورت منتظر بار شدن برنامه شما هستند.
- اگر در زیر آگهی باز برنامه صفحه بارگیری دارید و صفحه بارگیری شما
پیشاز بسته شدن آگهی بارگیری را تکمیل میکند، ممکن است بخواهید صفحه بارگیریتان را در
روش
adDidDismissFullScreenContentببندید.
مثال کامل در GitHub
مراحل بعدی
درباره حریم خصوصی کاربر بیشتر بدانید.