前置き
iOS 14以降にて表示することが可能になっていた ATT(App Tracking Transparency)ダイアログだが、筆者はAdmob のために利用していた。
で、最近のGoogle Admob のアップデートで、ATTダイアログ表示前に、カスタムIDFAメッセージを表示できるようになった。(どうやら Google User Messaging Platform SDK というのを使うらしい。)
このメッセージは、Admob ダッシュボード上で設定でき、アプリ側ではAPIのコールをしさえすれば表示できるらしい。
てことで、Unity 上で iOS native plugin を設置することで対応したい!
やること
- ATT ダイアログを表示させる旧スクリプト → プレIDFA メッセージを表示させる新スクリプトに移行
- 今まで objective-c (.mm ファイル)でiOS native plugin を作成していたが、swift コードの方が好きなのでswift で書くことにする。
必要なもの
Mobile Ads SDK (for Unity) のみ。
ただし、Mobile Ads SDK のバージョンは、 UMP SDK (Google User Messaging Platform SDK) が含まれているものを使用してください。
やったこと
公式URLを参照しつつ、
- 旧スクリプトの削除 (ATTダイアログ表示用の
objective-c
ファイル) - 新スクリプトの作成 (IDFAダイアログ表示用の
swift
ファイル) - 新スクリプト
swift
をUnityから呼び出すためのC#
スクリプト
1. 旧スクリプトの削除 (ATTダイアログ表示用のobjective-c
ファイル)
旧ファイルを削除
Assets/Plugins/iOS/RequestAttDialog.mm
#import <Foundation/Foundation.h>
#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <AdSupport/AdSupport.h>
//この範囲のコードはCで書かれてるよってこと
#ifdef __cplusplus
extern "C" {
#endif
//ATTダイアログを表示するメソッド
void requestIDFA() {
if (@available(iOS 14, *)){
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
// Tracking authorization completed. Start loading ads here.
// [self loadAd];
}];
}
}
#ifdef __cplusplus
}
#endif
2. 新スクリプトの作成 (IDFAダイアログ表示用のswift
ファイル)
新スクリプトの作成
Assets/Plugins/iOS/RequestIDFADialog.swift
import Foundation
import AppTrackingTransparency
import UserMessagingPlatform
extension UIViewController {
static func getFrontViewController() -> UIViewController? {
let keyWindow = UIApplication.shared.connectedScenes
.filter({$0.activationState == .foregroundActive})
.map({$0 as? UIWindowScene})
.compactMap({$0})
.first?.windows
.filter({$0.isKeyWindow}).first
let vc = keyWindow?.rootViewController
guard let _vc = vc?.presentedViewController else {
return vc
}
return _vc
}
}
public class UmpPlugins {
public static func requestIDFA() {
if #available(iOS 14, *) {
// UMPRequestParameters
let parameters = UMPRequestParameters()
// 許諾年齢未満であるか?
parameters.tagForUnderAgeOfConsent = false
// 事前許諾プロンプトの提示状況をリクエスト
// メインスレッドで呼ぶ必要あり
UMPConsentInformation.sharedInstance.requestConsentInfoUpdate(
with: parameters,
completionHandler: { error in
if let error = error {
// エラー
debugPrint(error.localizedDescription)
} else {
// 事前許諾プロンプトが利用可能かチェック
let formStatus = UMPConsentInformation.sharedInstance.formStatus
// UMPFormStatus.unknown:0 不明
// UMPFormStatus.available:1 利用可能
// UMPFormStatus.unavailable:2 利用不可
if formStatus == .available {
DispatchQueue.main.async {
// プロンプトをロード
UmpPlugins.loadIDFA()
}
}
}
}
)
}
}
private static func loadIDFA() {
// プロンプトの提示が必要
guard let vc = UIViewController.getFrontViewController() else {
return
}
UMPConsentForm.loadAndPresentIfRequired(from: vc)
}
}
@_cdecl("requestIDFA")
public func requestIDFA()
{
return UmpPlugins.requestIDFA()
}
3. 新スクリプトswift
をUnityから呼び出すためのC#
スクリプト
以下をどこかに設置。
using System.Runtime.InteropServices;
public class ShowAttDialog
{
#if UNITY_IOS
[DllImport("__Internal")]
private static extern int requestIDFA();
// public staticにしているので外部ファイルで「ShowAttDialog.RequestIDFA()」とすれば呼び出せる。
public static void RequestIDFA()
{
requestIDFA();
}
#endif
}
4. Admob ダッシュボードにてアプリを追加
IDFA 設定画面に行き、アプリ一覧に、作成中の新規アプリを追加する、
おしまい。
参考