【Unity / iOS14】IDFA 広告のトラッキング追跡の実装方法

【Unity / iOS14】IDFA 広告のトラッキング追跡の実装方法 Unity
スポンサーリンク

前回お伝えしたiOS14の「IDFA」や「SKAdNetwork」フレームワークの設定ですが、まだ設定が必要なことに気づいたのでさらに対応を入れることにしました。
備忘録としてお伝えしたいと思います。

はじめに

前回お伝えした記事では主にプラグインを追加した時のエラー対応だったので
色々抜けがあったようです。

なので今回プラグインが入っている前提でどのように
広告追跡を表示するかなどお伝えしていきたいと思います。

 

今回の目的

iOS14から必要になった広告トラッキングを承認するアプリを表示することを目的となります。

それが表示されてユーザーが承認されることで
ユーザーに適した広告が表示されるようになるみたいですね

 

ダウンロード

必要なファイルはダウンロードできるようにしておきました。
こちらのunitypackageをご自身のプロジェクトに追加すると必要なファイルが取り込まれます。

[Unity]iOS14広告トラッキング対応

それを追加の上、読み進んでいただけると幸いです

取り込み方はこちらをご確認ください。

 

全体の流れ

作業としては前回の記事ですでにAdmobなどのプラグインは追加済なので
iOSなどに必要なフレームワークを追加してネイティブコードを呼び出すことで実現します。

  1. Xcodeに必要な設定を行うスクリプトを追加(フレームワーク追加など)
  2. 呼び出すネイティブコードを追加
  3. ネイティブコード呼び出すスクリプトを作成
  4. アプリ開始時に上記スクリプトを呼び出す

といった流れでiOS画面上に「トラッキングを承認しますか?」といった文章を表示します。

これが無いとアプリでの広告報酬が
極端に下がってしまうことも…

 

Xcodeに設定するスクリプトを追加する

まずはXcodeに毎回設定することでも対応できるのですが
スクリプトで自動で追加されるようにしましょう。

下記スクリプトを「Assets/Editor」フォルダに追加しましょう(なければ作成)。

ソースコード:PostXcodeBuild.cs

using System.IO;
using UnityEditor;
using UnityEditor.Callbacks;
using System.Collections;
using System.Collections.Generic;
#if UNITY_IOS
using UnityEditor.iOS.Xcode;
#endif

public class PostXcodeBuild
{
#if UNITY_IOS
    [PostProcessBuild]
    public static void SetXcodePlist(BuildTarget buildTarget, string pathToBuiltProject)
    {
        if (buildTarget != BuildTarget.iOS){
            return;
        }

        // pbx
        {
            var projectPath = PBXProject.GetPBXProjectPath(pathToBuiltProject);
            var pbx = new PBXProject();
            pbx.ReadFromFile(projectPath);
            string targetGuid = GetTargetGuid(pbx);

            // admob
            pbx.AddFrameworkToProject(targetGuid, "AppTrackingTransparency.framework", true);

            pbx.WriteToFile(projectPath);
        }

        // plist
        {
            var plistPath = Path.Combine(pathToBuiltProject , "Info.plist");
            var plist = new PlistDocument();
            plist.ReadFromFile(plistPath);

            // skad
            var array = plist.root.CreateArray("SKAdNetworkItems");
            PlistElementDict dict = array.AddDict();
            dict.SetString("SKAdNetworkIdentifier", "cstr6suwn9.skadnetwork");
            File.WriteAllText(plistPath, plist.WriteToString());
             
            var root = plist.root;

            // track description
            root.SetString("NSUserTrackingUsageDescription", "本アプリは広告効果測定・分析のためにIDFA(広告識別子)を利用します。");
            plist.WriteToFile(plistPath);
        }

    }

    private static string GetTargetGuid(PBXProject pbx)
    {
#if UNITY_2019_3_OR_NEWER
        return pbx.GetUnityFrameworkTargetGuid();
#else
        return pbx.TargetGuidByName(PBXProject.GetUnityTargetName());
#endif
    }
#endif
}

 

これによってiOSをビルドした際に出力されるXcodeプロジェクトに必要な設定がされるようになりました!

 

ソースコードの処理について

処理は下記のようになっています。

  1. 「AppTrackingTransparency.framework」を追加
  2. 「SKAdNetworkIdentifier」の追加(前回の記事での対応)
  3. 「NSUserTrackingUsageDescription」の設定
    (広告のトラッキングを承認してもらう時に表示するテキスト)

なので「3.」の広告トラッキングの通知ウィンドウに表示する文章は
NSUserTrackingUsageDescriptionを設定しているところで変更可能です。

ローカライズする時は「InfoPlist.strings」を使えば
設定できるようなのでまた今度試してみたいと思います

 

 

ネイティブコードを追加する

ネイティブコードは「Objective-C」などの言語で記述したものを
「Assets/Plugin/iOS」以下に追加することでスクリプト側から呼ぶことができます。

コードはこちらを参考にしたので「AttObjC.mm」をご自身で用意して追加してみてください。
※ダウンロードされた方はそちらをご利用ください

 

 

ネイティブコードを呼び出すスクリプトを作成

下記のソースコードからファイルを作成し、
基本的には参考サイトを元にアタッチするだけで良いものを変更しています。

※ダウンロードされた方はそちらをご利用ください

ソースコード:AttObjC.cs

using System;
using System.Runtime.InteropServices;
using System.Threading;
using UnityEngine;

public class AttObjC : MonoBehaviour
{
    void Start()
    {
#if UNITY_IOS
        int status = AttObjC.GetTrackingAuthorizationStatus();
        if (status == 0) {
            AttObjC.RequestTrackingAuthorization();
        }
        Debug.Log("ATT状況:" + status);
#endif
    }

#if UNITY_IOS
    private const string DLL_NAME = "__Internal";
    [DllImport(DLL_NAME)]
    private static extern int Sge_Att_getTrackingAuthorizationStatus();
    private static int GetTrackingAuthorizationStatus()
    {
        if (Application.isEditor) {
            return -1;
        }
        return Sge_Att_getTrackingAuthorizationStatus();
    }
    [DllImport(DLL_NAME)]
    private static extern void Sge_Att_requestTrackingAuthorization(OnCompleteCallback callback);

    private delegate void OnCompleteCallback(int status);
    private static SynchronizationContext _context;
    private static Action _onComplete;

    private static void RequestTrackingAuthorization()
    {
        if (Application.isEditor) {
            return;
        }
#if UNITY_IOS
        _context = SynchronizationContext.Current;
        Sge_Att_requestTrackingAuthorization(OnRequestComplete);
#endif
    }
    [AOT.MonoPInvokeCallback(typeof(OnCompleteCallback))]
    private static void OnRequestComplete(int status)
    {
        if (_onComplete != null) {
            _context.Post(_ => {
                _onComplete = null;
            }, null);
        }
    }
#endif
}

そしてアプリ起動時などで呼び出される画面のゲームオブジェクトにスクリプトをアタッチすればOKです!

 

iOSで実行して確認

いつも通り実行するとXcodeにいつもはない
フレームワークファイルなどが追加されているはずです。

そして端末で実行すると「本アプリは広告効果測定・分析のためにIDFA(広告識別子)を利用します。」という確認画面が出現。
どうやら問題なさそうです!

 

アプリのPR

下記が今回この取り組みのきっかけになったアプリとなります。
ご興味などありましたらぜひご利用いただけると幸いです。

 

終わりに

いかがでしたでしょうか?

前回の対応だけだと不十分だったので追加で記事を作成しました。
これでみなさんのアプリ広告の収益にも影響がなければ幸いです。

では本記事はここで終わりたいと思います。
この度はここまでお読みいただきありがとうございました。

 

参考サイト

Unity/GoogleMobileAds/SKAdNetwork

コメント

スポンサーリンク
タイトルとURLをコピーしました