メインコンテンツへスキップ

概要

スプラッシュ広告は、アプリ起動時のスプラッシュ画面に表示される広告です。アプリのロゴと一緒に広告が表示され、自然なユーザー体験を提供します。

特徴

  • アプリ起動時の自然な広告表示
  • アプリロゴと一緒にブランドイメージを維持
  • 360px × 270px固定サイズ
  • 画像広告に対応
開発環境ではテストユニットIDを使用してください: PUBLIC_TEST_UNIT_ID_SPLASH

広告サイズ

スプラッシュ広告は固定サイズを使用します:
  • サイズ: 360px × 270px (幅 × 高さ)
  • 広告は画面下部に表示され、上部にはアプリロゴが配置されます

実装方法

スプラッシュ広告は、アプリの要件に応じて3つの方法で実装できます:
  1. AdropSplashAdViewControllerの使用 - 最も簡単な方法
  2. AdropSplashAdViewの使用 - カスタムスプラッシュ画面の構成
  3. SwiftUI実装 - SwiftUIアプリで使用

方法1: AdropSplashAdViewControllerの使用

最も簡単な実装方法です。AdropSplashAdViewControllerがスプラッシュ画面を自動的に管理します。

UIKit実装

import AdropAds

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        // Adrop SDKの初期化
        Adrop.initialize(production: false)

        return true
    }
}

SceneDelegateでスプラッシュ広告を表示

import UIKit
import AdropAds

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?

    func scene(
        _ scene: UIScene,
        willConnectTo session: UISceneSession,
        options connectionOptions: UIScene.ConnectionOptions
    ) {
        guard let windowScene = (scene as? UIWindowScene) else { return }

        // Windowの設定
        window = UIWindow(windowScene: windowScene)

        // スプラッシュ広告ビューコントローラーの生成
        let splashViewController = AdropSplashAdViewController(
            unitId: "YOUR_SPLASH_UNIT_ID"
        )
        splashViewController.logoImage = UIImage(named: "app_logo")  // アプリロゴ画像
        splashViewController.delegate = self

        // メインビューコントローラーの設定
        splashViewController.mainViewController = MainViewController()

        // 表示時間の設定(非推奨 — コンソールで設定してください、デフォルト1秒)
        splashViewController.displayDuration = 3.0

        // スプラッシュ画面をルートに設定
        window?.rootViewController = splashViewController
        window?.makeKeyAndVisible()
    }
}

初期化パラメータ

パラメータ説明
unitIdStringアドコントロールコンソールで作成したユニットID
adRequestTimeoutTimeInterval広告リクエストタイムアウト(秒)。デフォルト1.0

プロパティ

プロパティ説明
logoImageUIImage?アプリロゴ画像(initパラメータではなくプロパティとして設定)。nilの場合はロゴなしで表示
mainViewControllerUIViewController?広告終了後に遷移するメインビューコントローラー
backgroundColorUIColor?スプラッシュ画面の背景色。nilの場合はsystemBackgroundを使用
displayDurationTimeInterval広告表示時間(秒)。デフォルト1.0。非推奨 — コンソールで設定してください

デリゲートの実装

// MARK: - AdropSplashAdDelegate
extension SceneDelegate: AdropSplashAdDelegate {
    // スプラッシュ広告終了
    func onAdClose(_ ad: AdropSplashAd, impressed: Bool) {
        print("スプラッシュ広告終了 - 表示: \(impressed)")

        // メイン画面に遷移
        let mainViewController = MainViewController()
        window?.rootViewController = mainViewController
    }

    // 広告受信成功(オプション)
    func onAdReceived(_ ad: AdropSplashAd) {
        print("スプラッシュ広告受信成功")
    }

    // 広告受信失敗(オプション)
    func onAdFailedToReceive(_ ad: AdropSplashAd, _ errorCode: AdropErrorCode) {
        print("スプラッシュ広告受信失敗: \(errorCode)")
        // 広告失敗時もメイン画面に遷移します
    }

    // 広告表示(オプション)
    func onAdImpression(_ ad: AdropSplashAd) {
        print("スプラッシュ広告表示")
    }
}
AdropSplashAdViewControllerは広告の読み込み、表示、タイマー管理を自動的に処理します。広告が読み込まれなくても自動的にonAdCloseが呼び出され、メイン画面に遷移します。

LaunchScreenとの連携

スプラッシュ広告を表示する前に、システムのLaunchScreenが先に表示されます。自然なユーザー体験のために、LaunchScreenとスプラッシュ広告画面のスタイルを一致させることをお勧めします。

LaunchScreen.storyboardの設定

  1. LaunchScreen.storyboardを開き、背景色をスプラッシュ広告画面と同じに設定
  2. アプリロゴを中央に配置(スプラッシュ広告のロゴ位置と一致)
  3. Info.plistでUILaunchStoryboardNameLaunchScreenに設定されていることを確認
Info.plist
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
LaunchScreenとスプラッシュ広告画面の背景色とロゴ位置が一致すると、アプリ起動時にスムーズな遷移が可能です。

方法2: AdropSplashAdViewの使用

カスタムスプラッシュ画面を直接構成したい場合に使用します。
import UIKit
import AdropAds

class CustomSplashViewController: UIViewController {
    private var splashAdView: AdropSplashAdView?
    private let logoImageView = UIImageView()

    override func viewDidLoad() {
        super.viewDidLoad()
        // AdropSplashAdViewは初期化時に自動的にロードを処理するため、先に生成します
        splashAdView = AdropSplashAdView(unitId: "YOUR_SPLASH_UNIT_ID")
        splashAdView?.delegate = self
        setupUI()
    }

    private func setupUI() {
        view.backgroundColor = .white

        // アプリロゴの設定
        logoImageView.image = UIImage(named: "app_logo")
        logoImageView.contentMode = .scaleAspectFit
        logoImageView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(logoImageView)

        // スプラッシュ広告ビューの設定
        guard let splashAdView = splashAdView else { return }
        splashAdView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(splashAdView)

        NSLayoutConstraint.activate([
            // ロゴ: 画面中央上部
            logoImageView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            logoImageView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 100),
            logoImageView.widthAnchor.constraint(equalToConstant: 200),
            logoImageView.heightAnchor.constraint(equalToConstant: 200),

            // 広告: 画面下部
            splashAdView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            splashAdView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            splashAdView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
            splashAdView.heightAnchor.constraint(equalToConstant: 270)  // 固定高さ
        ])
    }
}

// MARK: - AdropSplashAdViewDelegate
extension CustomSplashViewController: AdropSplashAdViewDelegate {
    // スプラッシュ広告終了(必須)
    func onAdClose(_ adView: AdropSplashAdView, impressed: Bool) {
        print("スプラッシュ広告終了 - 表示: \(impressed)")
        transitionToMainScreen(impressed: impressed)
    }

    // 広告受信成功(オプション)
    func onAdReceived(_ adView: AdropSplashAdView) {
        print("スプラッシュ広告ビュー受信成功")
    }

    // 広告受信失敗(オプション)
    func onAdFailedToReceive(_ adView: AdropSplashAdView, _ errorCode: AdropErrorCode) {
        print("スプラッシュ広告ビュー受信失敗: \(errorCode)")
        // 失敗時はメイン画面に遷移
        transitionToMainScreen(impressed: false)
    }

    // 広告表示(オプション)
    func onAdImpression(_ adView: AdropSplashAdView) {
        print("スプラッシュ広告ビュー表示")
    }
}

// MARK: - Navigation
extension CustomSplashViewController {
    private func transitionToMainScreen(impressed: Bool) {
        guard let window = view.window else { return }

        let mainViewController = MainViewController()
        window.rootViewController = mainViewController

        // スムーズな遷移アニメーション
        UIView.transition(
            with: window,
            duration: 0.3,
            options: .transitionCrossDissolve,
            animations: nil,
            completion: nil
        )
    }
}
AdropSplashAdViewを使用する場合は、AdropSplashAdViewDelegateを実装する必要があります。onAdClose(impressed:)メソッドは必須です。

方法3: SwiftUI実装

SwiftUIアプリでスプラッシュ広告を実装する方法です。

SwiftUI Wrapper

import SwiftUI
import AdropAds

struct SplashAdView: UIViewControllerRepresentable {
    let unitId: String
    let logoImage: UIImage?
    @Binding var isPresented: Bool

    func makeUIViewController(context: Context) -> AdropSplashAdViewController {
        let controller = AdropSplashAdViewController(unitId: unitId)
        controller.logoImage = logoImage
        controller.delegate = context.coordinator
        return controller
    }

    func updateUIViewController(_ uiViewController: AdropSplashAdViewController, context: Context) {
        // 更新不要
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(isPresented: $isPresented)
    }

    class Coordinator: NSObject, AdropSplashAdDelegate {
        @Binding var isPresented: Bool

        init(isPresented: Binding<Bool>) {
            _isPresented = isPresented
        }

        func onAdClose(_ ad: AdropSplashAd, impressed: Bool) {
            print("スプラッシュ広告終了 - 表示: \(impressed)")
            DispatchQueue.main.async {
                self.isPresented = false
            }
        }

        func onAdReceived(_ ad: AdropSplashAd) {
            print("スプラッシュ広告受信成功")
        }

        func onAdFailedToReceive(_ ad: AdropSplashAd, _ errorCode: AdropErrorCode) {
            print("スプラッシュ広告受信失敗: \(errorCode)")
        }

        func onAdImpression(_ ad: AdropSplashAd) {
            print("スプラッシュ広告表示")
        }
    }
}

SwiftUI Appで使用

import SwiftUI
import AdropAds

@main
struct MyApp: App {
    init() {
        // SDKの初期化
        Adrop.initialize(production: false)
    }

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

struct ContentView: View {
    @State private var showSplash = true

    var body: some View {
        ZStack {
            if showSplash {
                SplashAdView(
                    unitId: "YOUR_SPLASH_UNIT_ID",
                    logoImage: UIImage(named: "app_logo"),
                    isPresented: $showSplash
                )
                .ignoresSafeArea()
            } else {
                MainView()
            }
        }
    }
}

struct MainView: View {
    var body: some View {
        NavigationView {
            VStack {
                Text("メイン画面")
                    .font(.largeTitle)
            }
            .navigationTitle("ホーム")
        }
    }
}

デリゲートメソッド

AdropSplashAdDelegate

AdropSplashAdを使用する場合のデリゲートです。
メソッド必須説明
onAdClose(impressed:)オプションスプラッシュ広告終了時に呼び出し。impressedパラメータで広告表示の有無を確認
onAdReceived(_:)オプション広告受信成功時に呼び出し
onAdFailedToReceive(_:_:)オプション広告受信失敗時に呼び出し
onAdImpression(_:)オプション広告表示が記録された時に呼び出し

AdropSplashAdViewDelegate

AdropSplashAdViewを使用する場合のデリゲートです。
メソッド必須説明
onAdClose(impressed:)必須スプラッシュ広告終了時に呼び出し。メイン画面への遷移処理が必要
onAdReceived(_:)オプション広告受信成功時に呼び出し
onAdFailedToReceive(_:_:)オプション広告受信失敗時に呼び出し
onAdImpression(_:)オプション広告表示が記録された時に呼び出し

クロージャコールバック

デリゲートの代わりにAdropSplashAdでクロージャベースのコールバックを使用できます。
let splashAd = AdropSplashAd(unitId: "YOUR_UNIT_ID")

splashAd.onAdReceived = { ad in
    print("スプラッシュ広告受信成功")
}

splashAd.onAdFailedToReceive = { ad, errorCode in
    print("スプラッシュ広告受信失敗: \(errorCode)")
}

splashAd.onAdImpression = { ad in
    print("スプラッシュ広告表示")
}

splashAd.onAdClose = { ad, impressed in
    print("スプラッシュ広告終了 - 表示: \(impressed)")
}
デリゲートとクロージャの両方を設定すると、両方が呼び出されます。

impressedパラメータ

onAdClose(impressed:)メソッドのimpressedパラメータは、広告が実際にユーザーに表示されたかどうかを示します。
func onAdClose(_ ad: AdropSplashAd, impressed: Bool) {
    if impressed {
        print("広告がユーザーに表示されました")
        // 広告表示後の処理ロジック
    } else {
        print("広告が表示されませんでした(ロード失敗またはスキップ)")
        // 広告未表示の処理ロジック
    }

    // メイン画面に遷移
    transitionToMainScreen()
}

impressedがfalseの場合

  • 広告ロード失敗
  • ネットワークエラー
  • ユーザーが広告を見る前にスキップ
  • 広告インベントリ不足

ベストプラクティス

1. 適切なタイマー設定

スプラッシュ広告は短すぎず長すぎず表示する必要があります。
// AdropSplashAdViewControllerは自動的にタイマーを管理します
// デフォルト: 1秒(広告ロード時間を含む)

2. ロゴ画像の最適化

アプリロゴは適切なサイズで準備し、ロード時間を最小化してください。
// 推奨ロゴサイズ: 200x200 〜 300x300ポイント
let logoImage = UIImage(named: "app_logo")  // @2x、@3xバージョンを準備

3. 失敗処理

広告ロード失敗時もアプリが正常に起動するように処理してください。
func onAdFailedToReceive(_ ad: AdropSplashAd, _ errorCode: AdropErrorCode) {
    print("広告ロード失敗: \(errorCode)")
    // 失敗してもメイン画面に遷移
    // AdropSplashAdViewControllerは自動的に処理
}

4. スムーズな画面遷移

メイン画面への遷移時に自然なアニメーションを使用してください。
private func transitionToMainScreen() {
    guard let window = view.window else { return }

    let mainViewController = MainViewController()

    UIView.transition(
        with: window,
        duration: 0.3,
        options: .transitionCrossDissolve,
        animations: {
            window.rootViewController = mainViewController
        },
        completion: nil
    )
}

5. テスト環境と本番環境の分離

開発環境と本番環境を分けてテストしてください。
#if DEBUG
let splashUnitId = "PUBLIC_TEST_UNIT_ID_SPLASH"
let isProduction = false
#else
let splashUnitId = "YOUR_PRODUCTION_SPLASH_UNIT_ID"
let isProduction = true
#endif

// SDKの初期化
Adrop.initialize(production: isProduction)

// スプラッシュ広告の作成
let splashViewController = AdropSplashAdViewController(
    unitId: splashUnitId
)
splashViewController.logoImage = UIImage(named: "app_logo")

完全なSceneDelegateの例

import UIKit
import AdropAds

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?

    func scene(
        _ scene: UIScene,
        willConnectTo session: UISceneSession,
        options connectionOptions: UIScene.ConnectionOptions
    ) {
        guard let windowScene = (scene as? UIWindowScene) else { return }

        // Windowの設定
        window = UIWindow(windowScene: windowScene)

        #if DEBUG
        let splashUnitId = "PUBLIC_TEST_UNIT_ID_SPLASH"
        #else
        let splashUnitId = "YOUR_PRODUCTION_SPLASH_UNIT_ID"
        #endif

        // スプラッシュ広告ビューコントローラーの生成
        let splashViewController = AdropSplashAdViewController(
            unitId: splashUnitId
        )
        splashViewController.logoImage = UIImage(named: "app_logo")
        splashViewController.delegate = self

        // ルートビューコントローラーの設定
        window?.rootViewController = splashViewController
        window?.makeKeyAndVisible()
    }
}

// MARK: - AdropSplashAdDelegate
extension SceneDelegate: AdropSplashAdDelegate {
    func onAdClose(_ ad: AdropSplashAd, impressed: Bool) {
        print("スプラッシュ広告終了 - 表示: \(impressed)")

        // メイン画面に遷移
        let mainViewController = MainViewController()
        let navigationController = UINavigationController(rootViewController: mainViewController)

        guard let window = window else { return }

        UIView.transition(
            with: window,
            duration: 0.3,
            options: .transitionCrossDissolve,
            animations: {
                window.rootViewController = navigationController
            },
            completion: nil
        )
    }

    func onAdReceived(_ ad: AdropSplashAd) {
        print("スプラッシュ広告受信成功")
    }

    func onAdFailedToReceive(_ ad: AdropSplashAd, _ errorCode: AdropErrorCode) {
        print("スプラッシュ広告受信失敗: \(errorCode)")
        // AdropSplashAdViewControllerが自動的にonAdCloseを呼び出します
    }

    func onAdImpression(_ ad: AdropSplashAd) {
        print("スプラッシュ広告表示記録")
    }
}

テスト

テストユニットID

開発中はテストユニットIDを使用してください。
// テストユニットID
let testUnitId = "PUBLIC_TEST_UNIT_ID_SPLASH"

// またはAdropUnitIdを使用
let testUnitId = AdropUnitId.PUBLIC_TEST_UNIT_ID_SPLASH
本番リリース時は、必ずアドコントロールコンソールで作成した実際のユニットIDを使用してください。テストユニットIDでは広告収益が発生しません。

デバッグ

広告イベントをログで確認してください。
extension SceneDelegate: AdropSplashAdDelegate {
    func onAdReceived(_ ad: AdropSplashAd) {
        #if DEBUG
        print("スプラッシュ広告受信")
        #endif
    }

    func onAdFailedToReceive(_ ad: AdropSplashAd, _ errorCode: AdropErrorCode) {
        #if DEBUG
        print("スプラッシュ広告失敗: \(errorCode)")
        print("  - ネットワーク状態を確認")
        print("  - ユニットIDを確認: \(ad.unitId)")
        #endif
    }

    func onAdImpression(_ ad: AdropSplashAd) {
        #if DEBUG
        print("スプラッシュ広告表示")
        #endif
    }

    func onAdClose(_ ad: AdropSplashAd, impressed: Bool) {
        #if DEBUG
        print("スプラッシュ広告終了")
        print("  - 表示有無: \(impressed)")
        #endif
    }
}

トラブルシューティング

  • window.rootViewControllerが正しく設定されているか確認
  • SceneDelegateが有効になっているか確認(Info.plist)
  • SDKの初期化が完了しているか確認
  • ネットワーク接続状態を確認
  • ユニットIDが正しいか確認
  • テスト環境ではproduction: false設定を確認
  • onAdFailedToReceiveエラーコードを確認
  • onAdClose(impressed:) デリゲートが実装されているか確認
  • 画面遷移コードがメインスレッドで実行されているか確認
func onAdClose(_ ad: AdropSplashAd, impressed: Bool) {
    DispatchQueue.main.async {
        // 画面遷移コード
    }
}
  • AdropSplashAdViewDelegateを実装しているか確認
  • splashAdView.delegate = selfが設定されているか確認
  • onAdClose(impressed:)メソッドは必須で実装する必要があります

次のステップ

インタースティシャル広告

画面遷移時のインタースティシャル広告の表示

バナー広告

バナー広告の実装

ネイティブ広告

カスタムデザインのネイティブ広告

リワード広告

ユーザーリワードの提供