Uygulama Açılış Reklamları

Bu kılavuz, uygulama açılış reklamlarını entegre eden yayıncılar için hazırlanmıştır.

Uygulama açılış reklamları, uygulama yükleme ekranlarından para kazanmak isteyen yayıncılara yönelik özel bir reklam biçimidir. Uygulama açılış reklamları, kullanıcılarınız tarafından diledikleri zaman kapatılabilir. Uygulama açılış reklamları, kullanıcılar uygulamanızı ön plana getirdiğinde gösterilebilir.

Uygulama açılış reklamları, kullanıcılara uygulamanızda olduklarını hatırlatmak için otomatik olarak küçük bir marka alanı gösterir. Aşağıda uygulama açılış reklamının nasıl göründüğüne dair bir örnek verilmiştir:

Uygulama açılış reklamlarını uygulamak için gereken adımlar genel hatlarıyla aşağıdaki gibidir:

  1. Göstermeniz gerekmeden önce reklamı yükleyen bir yönetici sınıfı oluşturun.
  2. Eklentiyi, uygulama ön planda olduğunda gösterin.
  3. Sunu geri çağırmalarını işleme

Ön koşullar

Her zaman test reklamlarıyla test yapın

Uygulamalarınızı oluşturup test ederken yayındaki üretim reklamları yerine test reklamları kullandığınızdan emin olun. Aksi takdirde hesabınız askıya alınabilir.

Test reklamlarını yüklemenin en kolay yolu, uygulama açılış reklamları için özel test reklam birimi kimliğimizi kullanmaktır:

/21775744923/example/app-open

Her istek için test reklamları döndürecek şekilde özel olarak yapılandırılmıştır. Kodlama, test etme ve hata ayıklama sırasında kendi uygulamalarınızda kullanabilirsiniz. Uygulamanızı yayınlamadan önce bu kimliği kendi reklam birimi kimliğinizle değiştirmeniz yeterlidir.

Mobile Ads SDK'sının test reklamlarının işleyiş şekli hakkında daha fazla bilgi için Test Reklamları başlıklı makaleyi inceleyin.

Yönetici sınıfı uygulama

Reklamınız hızlı bir şekilde gösterilmelidir. Bu nedenle, reklamınızı göstermeniz gerekmeden önce yüklemeniz en iyisidir. Bu sayede, kullanıcı uygulamanıza girer girmez yayınlanmaya hazır bir reklamınız olur. Reklamı göstermeniz gereken zamandan önce reklam isteği göndermek için bir yönetici sınıfı uygulayın.

AppOpenAdManager adlı yeni bir tekil sınıf oluşturun ve sınıfı aşağıdaki gibi doldurun:

Swift

class AppOpenAdManager: NSObject {
  var appOpenAd: GADAppOpenAd?
  var isLoadingAd = false.
  var isShowingAd = false

  static let shared = AppOpenAdManager()

  private func loadAd() async {
    // TODO: Implement loading an ad.
  }

  func showAdIfAvailable() {
    // TODO: Implement showing an ad.
  }

  private func isAdAvailable() -> Bool {
    // Check if ad exists and can be shown.
    return appOpenAd != nil
  }
}

Objective-C

@interface AppOpenAdManager ()
@property(nonatomic, strong) GADAppOpenAd *appOpenAd;
@property(nonatomic, assign) BOOL isLoadingAd;
@property(nonatomic, assign) BOOL isShowingAd;

@end

@implementation AppOpenAdManager

+ (nonnull AppOpenAdManager *)sharedInstance {
  static AppOpenAdManager *instance = nil;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    instance = [[AppOpenAdManager alloc] init];
  });
  return instance;
}

- (void)loadAd {
  // TODO: Implement loading an ad.
}

// Add this method to the .h file.
- (void)showAdIfAvailable {
  // TODO: Implement showing an ad.
}

- (BOOL)isAdAvailable {
  // Check if ad exists and can be shown.
  return self.appOpenAd != nil;
}

@end

Reklam yükleme

Sonraki adım, loadAd() yöntemini doldurmaktır.

Swift

private 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 GADAppOpenAd.load(
      withAdUnitID: "/21775744923/example/app-open", request: GAMRequest())
  } catch {
    print("App open ad failed to load with error: \(error.localizedDescription)")
  }
  isLoadingAd = false
}

Objective-C

- (void)loadAd {
  // Do not load ad if there is an unused ad or one is already loading.
  if (self.isLoadingAd || [self isAdAvailable]) {
    return;
  }
  self.isLoadingAd = YES;

  [GADAppOpenAd loadWithAdUnitID:@"/21775744923/example/app-open"
                       request:[GAMRequest request]
             completionHandler:^(GADAppOpenAd *_Nullable appOpenAd, NSError *_Nullable error) {
               self.isLoadingAd = NO;
               if (error) {
                 NSLog(@"Failed to load app open ad: %@", error);
                 return;
               }
               self.appOpenAd = appOpenAd;
             }];
}

Reklam gösterme

Sonraki adım, showAdIfAvailable() yöntemini doldurmaktır. Kullanılabilir reklam yoksa yöntem bir reklam yüklemeye çalışır.

Swift

func showAdIfAvailable() {
  // If the app open ad is already showing, do not show the ad again.
  guard !isShowingAd else { return }

  // If the app open ad is not available yet but is supposed to show, load
  // a new ad.
  if !isAdAvailable() {
    Task {
      await loadAd()
    }
    return
  }

  if let ad = appOpenAd {
    isShowingAd = true
    ad.present(fromRootViewController: nil)
  }
}

Objective-C

- (void)showAdIfAvailable {
  // If the app open ad is already showing, do not show the ad again.
  if (self.isShowingAd) {
    return;
  }

  // If the app open ad is not available yet but is supposed to show, load a
  // new ad.
  if (![self isAdAvailable]) {
    [self loadAd];
    return;
  }

  self.isShowingAd = YES;
  [self.appOpenAd presentFromRootViewController:nil];
}

Reklamı, uygulama ön planda olduğunda gösterme

Uygulama etkin hale geldiğinde, mevcut bir reklam varsa göstermek veya yeni bir reklam yüklemek için showAdIfAvailable() işlevini çağırın.

Swift

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
  // ...

  func applicationDidBecomeActive(_ application: UIApplication) {
    // Show the app open ad when the app is foregrounded.
    AppOpenAdManager.shared.showAdIfAvailable()
  }
}

Objective-C

@implementation AppDelegate
// ...

- (void) applicationDidBecomeActive:(UIApplication *)application {
  // Show the app open ad when the app is foregrounded.
  [AppOpenAdManager.sharedInstance showAdIfAvailable];
}

@end

Sunum geri aramalarını işleme

Uygulamanız bir uygulama açılış reklamı gösterdiğinde belirli sunum etkinliklerini işlemek için GADFullScreenContentDelegate'ten yararlanmanız gerekir. Özellikle, ilk reklamın sunumu sona erdiğinde bir sonraki uygulama açılış reklamını istemeniz gerekir.

AppOpenAdManager sınıfınıza aşağıdakileri ekleyin:

Swift

class AppOpenAdManager: NSObject, GADFullScreenContentDelegate {
  // ...

  private 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 GADAppOpenAd.load(
        withAdUnitID: "/21775744923/example/app-open", request: GAMRequest())
      appOpenAd?.fullScreenContentDelegate = self
    } catch {
      print("App open ad failed to load with error: \(error.localizedDescription)")
    }
    isLoadingAd = false
  }

  // ...

  // MARK: - GADFullScreenContentDelegate methods

  func adWillPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
    print("App open ad will be presented.")
  }

  func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
    appOpenAd = nil
    isShowingAd = false
    // Reload an ad.
    Task {
      await loadAd()
    }
  }

  func ad(
    _ ad: GADFullScreenPresentingAd,
    didFailToPresentFullScreenContentWithError error: Error
  ) {
    appOpenAd = nil
    isShowingAd = false
    // Reload an ad.
    Task {
      await loadAd()
    }
  }
}

Objective-C

@interface AppOpenAdManager () <GADFullScreenContentDelegate>
@property(nonatomic, strong) GADAppOpenAd *appOpenAd
@property(nonatomic, assign) BOOL isLoadingAd;
@property(nonatomic, assign) BOOL isShowingAd;

@end

@implementation AppOpenAdManager

// ...

- (void)loadAd {
  // Do not load ad if there is an unused ad or one is already loading.
  if (self.isLoadingAd || [self isAdAvailable]) {
    return;
  }
  self.isLoadingAd = YES;

  [GADAppOpenAd loadWithAdUnitID:@"/21775744923/example/app-open"
                       request:[GAMRequest request]
             completionHandler:^(GADAppOpenAd *_Nullable appOpenAd, NSError *_Nullable error) {
              self.isLoadingAd = NO;
               if (error) {
                 NSLog(@"Failed to load app open ad: %@", error);
                 return;
               }
               self.appOpenAd = appOpenAd;
               self.appOpenAd.fullScreenContentDelegate = self;
             }];
}

- (BOOL)isAdAvailable {
  // Check if ad exists and can be shown.
  return self.appOpenAd != nil;
}

// ...

#pragma mark - GADFullScreenContentDelegate methods

- (void)adWillPresentFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
  NSLog(@"App open ad is will be presented.");
}

- (void)adDidDismissFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
  self.appOpenAd = nil;
  self.isShowingAd = NO;
  // Reload an ad.
  [self loadAd];
}

- (void)ad:(nonnull id<GADFullScreenPresentingAd>)ad
    didFailToPresentFullScreenContentWithError:(nonnull NSError *)error {
  self.appOpenAd = nil;
  self.isShowingAd = NO;
  // Reload an ad.
  [self loadAd];
}

@end

Reklam geçerlilik süresini göz önünde bulundurma

Geçerlilik süresi dolan bir reklamı göstermediğinizden emin olmak için uygulama temsilcisine, reklam referansınızın yüklendiği tarihten itibaren geçen süreyi kontrol eden bir yöntem ekleyebilirsiniz.

AppOpenAdManager hesabınıza loadTime adlı bir Date özelliği ekleyin ve reklamınız yüklendiğinde özelliği ayarlayın. Ardından, reklamınızın yüklenmesi üzerinden belirli bir saatten az süre geçmişse true döndüren bir yöntem ekleyebilirsiniz. Reklamı göstermeyi denemeden önce reklam referansınızın geçerliliğini kontrol edin.

Swift

class AppOpenAdManager: NSObject, GADFullScreenContentDelegate {
  var appOpenAd: GADAppOpenAd?
  var isLoadingAd = false.
  var isShowingAd = false
  var loadTime: Date?
  let fourHoursInSeconds = TimeInterval(3600 * 4)

  // ...

  private 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 GADAppOpenAd.load(
        withAdUnitID: "/21775744923/example/app-open", request: GAMRequest())
      appOpenAd?.fullScreenContentDelegate = self
      loadTime = Date()
    } catch {
      print("App open ad failed to load with error: \(error.localizedDescription)")
    }
    isLoadingAd = false
  }

  private func wasLoadTimeLessThanFourHoursAgo() -> Bool {
    guard let loadTime = loadTime else { return false }
    // Check if ad was loaded more than four hours ago.
    return Date().timeIntervalSince(loadTime) < fourHoursInSeconds
  }

  private func isAdAvailable() -> Bool {
    // Check if ad exists and can be shown.
    return appOpenAd != nil && wasLoadTimeLessThanFourHoursAgo()
  }
}

Objective-C

static NSTimeInterval const fourHoursInSeconds = 3600 * 4;

@interface AppOpenAdManager () <GADFullScreenContentDelegate>
@property(nonatomic, strong) GADAppOpenAd *appOpenAd
@property(nonatomic, assign) BOOL isLoadingAd;
@property(nonatomic, assign) BOOL isShowingAd;
@property(weak, nonatomic) NSDate *loadTime;

@end

@implementation AppOpenAdManager

// ...

- (void)loadAd {
  // Do not load ad if there is an unused ad or one is already loading.
  if (self.isLoadingAd || [self isAdAvailable]) {
    return;
  }
  self.isLoadingAd = YES;

  [GADAppOpenAd loadWithAdUnitID:@"/21775744923/example/app-open"
                       request:[GAMRequest request]
             completionHandler:^(GADAppOpenAd *_Nullable appOpenAd, NSError *_Nullable error) {
              self.isLoadingAd = NO;
               if (error) {
                 NSLog(@"Failed to load app open ad: %@", error);
                 return;
               }
               self.appOpenAd = appOpenAd;
               self.appOpenAd.fullScreenContentDelegate = self;
               self.loadTime = [NSDate date];
             }];
}

- (BOOL)wasLoadTimeLessThanFourHoursAgo {
  // Check if ad was loaded more than four hours ago.
  return [[NSDate Date] timeIntervalSinceDate:self.loadTime] < fourHoursInSeconds;
}

- (BOOL)isAdAvailable {
  // Check if ad exists and can be shown.
  return self.appOpenAd != nil && [self wasLoadTimeLessThanFourHoursAgo];
}

@end

Sıfırdan başlatma ve yükleme ekranları

Dokümanda, uygulama açılış reklamlarını yalnızca kullanıcılar uygulamanızı bellekte askıya alınmışken ön plana getirdiğinde gösterdiğiniz varsayılır. "Sıfırdan başlatma", uygulamanız başlatılırken daha önce bellekte askıya alınmamışsa gerçekleşir.

Sıfırdan başlatmaya örnek olarak kullanıcının uygulamanızı ilk kez açması verilebilir. Sıfırdan başlatma işleminde, hemen gösterilmeye hazır olan önceden yüklenmiş bir uygulama açılış reklamınız olmaz. Reklam isteğinde bulunduğunuz zaman ile reklamın size geri gönderilmesi arasında geçen gecikme, kullanıcıların bağlam dışı bir reklamla karşılaşmadan önce uygulamanızı kısa süreliğine kullanabildiği bir durum oluşturabilir. Bu, kötü bir kullanıcı deneyimi olduğundan önlenmelidir.

Uygulama açılış reklamlarını baştan başlatma sırasında kullanmanın tercih edilen yolu, oyun veya uygulama öğelerinizi yüklemek için bir yükleme ekranı kullanmak ve reklamı yalnızca yükleme ekranından göstermektir. Uygulamanız yüklenmeyi tamamladıysa ve kullanıcıyı uygulamanızın ana içeriğine gönderdiyse reklamı göstermeyin.

En iyi uygulamalar

Google, uygulamanızın yükleme ekranından para kazanmanıza yardımcı olmak için uygulama açılış reklamlarını geliştirmiştir. Ancak kullanıcılarınızın uygulamanızı kullanmaktan keyif alması için en iyi uygulamaları göz önünde bulundurmanız önemlidir. Şunları yaptığınızdan emin olun:

  • İlk uygulama açılış reklamınızı, kullanıcılarınız uygulamanızı birkaç kez kullandıktan sonra gösterin.
  • Kullanıcılarınızın uygulamanızın yüklenmesini beklediği zamanlarda uygulama açılış reklamları gösterin.
  • Uygulama açılış reklamının altında yükleme ekranınız varsa ve reklam kapatılmadan önce yükleme ekranınızın yüklenmesi tamamlanırsa yükleme ekranınızı adDidDismissFullScreenContent yönteminde kapatmayı deneyebilirsiniz.

GitHub'daki eksiksiz örnek

Swift Objective-C

Sonraki adımlar

Kullanıcı gizliliği hakkında daha fazla bilgi edinin.