アプリケーション開発ポータルサイト
ServerNote.NET
Amazon.co.jpでPC関連商品タイムセール開催中!
カテゴリー【SwiftiPhone/iPadMacOSXcode
【Swift UI】CocoaPodsを導入してGoogle Mobile SDKを使う
POSTED BY
2023-10-20

公式ではsudo gem install cocoapodsとあるが、当方環境では配下のツールのバージョンエラーがどうたらでうまくインストールできなかった。

なので、HomeBrewを使う方法でインストールした。

brew install cocoapods

最後に/usr/local/binにシンボリックリンクを貼るところでエラーが発生したので、手動でリンクを貼る。

cd /usr/local/bin
ln -s /usr/local/Cellar/cocoapods/1.13.0/bin/pod

これでpodコマンドが使えるようになった。

pod --version
1.13.0

Podfileを作成するにはProjectName.xcodeprojがあるフォルダでpod initを実行する。xcodeprojフォルダの中では無いので注意。

cd MyProject
ls -alF
MyProject
MyProject.xcodeproj
# ここで実行
pod init

Google Moble SDKをPodfileに追加する

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
platform :ios, '14.0'

target 'MyProject' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for MyProject
  pod 'Google-Mobile-Ads-SDK'

end

post_install do | installer |
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '14.0'
        end
    end
end

ここで、このプロジェクトはiOS Deployment Target を14.0にしているので、上記のiOSの箇所もコメントアウトを外して14.0に設定している。またそれをした場合、インストール後のライブラリのターゲット設定も14にしないと警告が出まくるので、post_installで自動設定するようにした。

プロジェクトにインストールする

pod install --repo-update

Updating local specs repositories
Analyzing dependencies
Downloading dependencies
Generating Pods project
Integrating client project
Pod installation complete! There is 1 dependency from the Podfile and 6 total pods installed.

Xcodeでプロジェクトを開く。ProjectName.xcworkspaceファイルをダブルクリックしないとAdMobを認識しないので注意!!

Info.plistを手動編集する
左ペインの「Info」を右クリック→Open As→Source Codeで開く。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>GADApplicationIdentifier</key>
        <string>ca-app-pub-3940256099942544~1458002511</string>
        <key>SKAdNetworkItems</key>
        <array>
            <dict>
                <key>SKAdNetworkIdentifier</key>
                <string>cstr6suwn9.skadnetwork</string>
            </dict>
            <dict>
                <key>SKAdNetworkIdentifier</key>
                <string>p78axxw29g.skadnetwork</string>
            </dict>
        </array>
        <key>GADIsAdManagerApp</key>
        <true/>
    </dict>
</plist>

テスト広告を表示するだけなら↑ページサンプルそのままで良いらしい。本番はca-app-pub-が自分のものに差し替え。

ビルド前にワーニングをつぶす。ほとんどが、iOS Deployment Targetが合っていないぞ、というもの。エラーをクリックして該当箇所に飛んで、プロジェクト本体のDeployment Targetとバージョンを合わせる。5箇所くらいなはず。

Swift UIでAdMobバナー広告および全画面広告を表示するサンプルを書く。

メイン関数ファイルに、以下AdMobの初期化コードを書く。

SwiftAdMobApp.swiftGitHub Source
//
//  AdMobApp.swift
//  AdMob
//  Created by ServerNote.NET on 2023/09/18.
//

import SwiftUI
import GoogleMobileAds

class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions
                     launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        GADMobileAds.sharedInstance().start(completionHandler: nil)
        return true
    }
}

@main
struct AdMobApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    var body: some Scene {
        WindowGroup {
            AdMobView()
        }
    }
}

そして以下がメインビュー。AdMobBannerViewを常時表示、そしてその下のTextをタップするとAdMobScreenViewを起動し全画面広告を表示する。showAdObjectの都度loadAdObjectしているのがポイント。こうしないと2回目以降エラーになる。

SwiftAdMobView.swiftGitHub Source
//
//  AdMobView.swift
//  AdMob
//  Created by ServerNote.NET on 2023/10/19.
//

import SwiftUI
import GoogleMobileAds

struct AdMobBannerView : UIViewControllerRepresentable {
    func makeUIViewController(context: Context) -> some UIViewController {
        let view = GADBannerView(adSize: GADAdSizeBanner)
        let viewController = UIViewController()
        view.adUnitID = "ca-app-pub-3940256099942544/2934735716"
        view.rootViewController = viewController
        view.load(GADRequest())
        viewController.view.addSubview(view)
        viewController.view.frame = CGRect(origin: .zero, size: GADAdSizeBanner.size)
        return viewController
    }
    
    func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {
    }
}

class AdMobScreenView: NSObject, ObservableObject, GADFullScreenContentDelegate {
    
    static var shared = AdMobScreenView()
    var adObject:GADInterstitialAd?
    
    override init() {
        adObject = nil
        super.init()
    }
    
    func loadAdObject() {
        GADInterstitialAd.load(withAdUnitID: "ca-app-pub-3940256099942544/4411468910", request: GADRequest()) { (ad, error) in
            if let _ = error {
                print("AdMobScreenView.loadAdObject error=\(error!)")
                return
            }
            print("AdMobScreenView.loadAdObject success")
            self.adObject = ad
            self.adObject?.fullScreenContentDelegate = self
        }
    }
    
    func showAdObject() {
        self.loadAdObject()
        let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
        let root = windowScene?.windows.first!.rootViewController
        self.adObject?.present(fromRootViewController: root!)
    }
    
    func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) {
        print("AdMobScreenView.didFailToPresentFullScreenContentWithError")
    }
    
    func adWillPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
        print("AdMobScreenView.adWillPresentFullScreenContent")
    }
    
    func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
        print("AdMobScreenView.adDidDismissFullScreenContent")
    }
}

struct AdMobView: View {
    
    @ObservedObject var adScreen = AdMobScreenView.shared
    
    var body: some View {
        VStack() {
            AdMobBannerView().frame(width: 320, height: 50)
            Text("Tap to open full screen AD")
                .font(.largeTitle)
                .onAppear() {
                    adScreen.loadAdObject()
                }
                .onTapGesture {
                    adScreen.showAdObject()
                }
        }
    }
}

struct AdMobView_Previews: PreviewProvider {
    static var previews: some View {
        AdMobView()
    }
}

SDKに変更があったら随時更新します。お疲れ様でした。

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!
ご連絡は以下アドレスまでお願いします★

☆ServerNote.NETショッピング↓
ShoppingNote / Amazon.co.jp
☆お仲間ブログ↓
一人社長の不動産業務日誌
【キーワード検索】