続・Guideline 5.1.2対応が必要だった話【UnityAds+AppStore】

UnityAdsを使った広告実装をしたアプリをリリースした際にAppStoreからGuideline5.1.2に抵触したときの対応話の続き。悲しいことにレビューには運も絡むみたいですね・・・。

目次

UnityAds用のGDPR対応が必要

前回の対応ではiOS側でATT対応すればよかったんですが、どうやらそれでは不十分だったようです。まぁ冷静に考えたら許可するかどうかによってなんの振る舞いも変えたりしてないですからね。今回参考にしたのはUnityAds側の実装例を参考にしました(https://docs.unity.com/ads/GDPRCompliance.html)。

リジェクト内容について

リジェクト内容は以下

Guideline 5.1.2 – Legal – Privacy – Data Use and Sharing

We still noticed you collect data to track after the user selects “Ask App Not to Track” on the App Tracking Transparency permission request.

Specifically, we noticed your app accesses web content (AD) you own and collects cookies for tracking after the user asked you not to track them.

You can locate this by the followings:

– Go to Shop
– Tap on “試聴する”

Next Steps

To resolve this issue, please revise your app so that you do not collect data for tracking purposes if the user does not give permission for tracking.

Please see attached screenshots for details.

内容的には「トラックすんなって言ったのにクッキー使いっぱなんだが?」という感じでお怒りです。実はこのアプリ対応ですが、ほぼ同じ時期に3つのアプリ対応をしていました。そのうちの2つはここの指摘がなく、3つ目のアプリにだけ指摘が入りました。

おそらくレビュアーによってクッキーのトラッキングがされているかどうかまで見てる人と見ていない人がいるんじゃないかな?と勝手に推測。立て続けにリリースしていたおかげで色々と比較が出来て良かったのかな?と思いました。

実際に行った対応

GDPR用の対応として参考になったのはこちらのリンク。トラッキングを許可したかどうかによってメタデータをセットすることでトラッキングを行うかどうかを切り替えることが出来ます。ただ、私が引っかかってしまったのはMetaDataをセットするタイミングです。公式側の紹介ではメタデータをセットする方法しか書いておらず、どのタイミングで行うかは書いていませんでした。初期化から含め、以下のような流れで行ったら審査を通過することが出来ました。

    private IEnumerator SetupAttAndAdAsync()
    {
#if UNITY_IPHONE || UNITY_IOS
        var status = ATTrackingStatusBinding.GetAuthorizationTrackingStatus();

#if !UNITY_EDITOR
        Version currentVersion = new Version(Device.systemVersion);
        Version ios14 = new Version("14.5");
        if (currentVersion < ios14)
        {
            // ここはエディター用。AUTHORIZED or NOT_DETERMINED
            status = ATTrackingStatusBinding.AuthorizationTrackingStatus.DENIED;
        }
#endif
        if (status == ATTrackingStatusBinding.AuthorizationTrackingStatus.NOT_DETERMINED)
        {
            ATTrackingStatusBinding.RequestAuthorizationTracking(AuthorizationTrackingReceived);
            while (status == ATTrackingStatusBinding.AuthorizationTrackingStatus.NOT_DETERMINED)
            {
                status = ATTrackingStatusBinding.GetAuthorizationTrackingStatus();
                yield return new WaitForEndOfFrame();
#if UNITY_EDITOR
                // この行はなくても大丈夫だけど、一応無限ループ対応
                status = ATTrackingStatusBinding.AuthorizationTrackingStatus.AUTHORIZED;
#endif
            }
        }
#endif
        //広告の初期化
        Advertisement.Initialize(ゲームのID(string), テストモード(bool), this);  // ここはご自身の初期化処理を行って下さい

        // GDPRダイアログ対応
        if (ATTrackingStatusBinding.GetAuthorizationTrackingStatus() == ATTrackingStatusBinding.AuthorizationTrackingStatus.AUTHORIZED)
        {
            MetaData gdprMetaData = new MetaData("gdpr");
            gdprMetaData.Set("consent", "true");
            Advertisement.SetMetaData(gdprMetaData);
        }
        else
        {
            MetaData gdprMetaData = new MetaData("gdpr");
            gdprMetaData.Set("consent", "false");
            Advertisement.SetMetaData(gdprMetaData);
        }

        while (!Advertisement.isInitialized)
        {
            yield return new WaitForSeconds(0.5f);
        }

        // ここからはリワード広告やインタースティシャル広告やバナー広告、好きな広告をロードして下さい!
    }

多少実際のソースとは違いますが、だいたいこんな感じ。OnInitializationCompleteなどのコールバックメソッドなどは使わないまま広告関係の処理を用意しました。もともとMetaDataは一つ変数を用意して、内容を変えたりして代入してたんですが、色々試した最終形はこんな感じに落ち着きました。

私がハマったところ

処理自体は難しい内容ではなかったんですが、順番がわからずに少し手間取りました。

InitializeのあとにSetMetaData

個人的に?と思ったのはメタデータなどを事前にセットした状態で初期化処理(Initialize)を呼び出すとばかり思っていたため、最初に実装したときは最終形態とは順序が逆になっていました。

Initializeにはコールバック処理があるため、完了後に行うべきかと思いましたが、実際の実装では読んだ直後にSetMetaDataしています。これはInitializeが呼ばれた直後に何らかのデータがクリアされ、新たにメタデータをセットしなければ有効にならないということなのかなと理解しました。

ひょっとしたら今後コールバック(初期化完了後)でメタデータをセットしないとうまくいかないという日が来るかも知れませんね。

MetaDataはそれぞれ用意した

ここに関してはもう一度試す機会があればトライしてみたいところですが、MetaDataは一つにまとめたいですね。もともとの処理では

bool isGdpr = ATTrackingStatusBinding.GetAuthorizationTrackingStatus() == ATTrackingStatusBinding.AuthorizationTrackingStatus.AUTHORIZED;
MetaData gdprMetaData = new MetaData("gdpr");
gdprMetaData.Set("consent",isGdpr.ToString());
Advertisement.SetMetaData(gdprMetaData);

のように一つの変数にしていました。だた、公式の方もそれぞれ別々に記載していたのと、私が審査通ったのも別々に下バージョンだったので、もう洒落たことはしないでそのまま審査出しました。

動作保証がされたものは偉い(歴史的事実)。このあたりの検証は時間がある時にあまり申告ではないアップデートで試してみたいと思います。

あとがき

今回の件、ネットの記事を見てもできてる人と出来てない人で別れてしまってるんじゃないでしょうか?自分はたまたま複数まとめてアップデートする機会があったので気づきました。

レビュアーに依存するというのはあくまで予想ですが、あながち間違ってない予想だと思ってます。

あとは、日本にいるとそもそもレビューで戻ってきた画像が見れないというのもリジェクト対応がわかりにくくなる要因の一つではないかと思います。

なんにせよ、同じようなことで困ってる人の一助になればと思います。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次