ATT 대응과 UnityAds를 병용하면 거부를 먹은 이야기와 그 해결 방법

소개



iOS 어플을 작성하는데 있어서는 피해서는 어려운, 아는 iOS14로부터의 ATT(App Tracking Transparency) 대응.
자신도 이번 졸작 「두 장 남기는 도장」에 짜넣어 보았습니다.
앱은 이쪽↓(선전)



최초의 실장시에 참고로 한 것은 이쪽↓

갑자기 거부



그런데, 몇번인가 버전 갱신한 곳, 갑자기 거부가…
Guideline 5.1.2 - Legal - Privacy - Data Use and Sharing

We 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 you own and collects cookies for tracking after the user asked you not to track them.

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.

Resources
- Tracking is linking data collected from your app with third-party data for advertising purposes, or sharing the collected data with a data broker. Learn more about tracking.
- See Frequently Asked Questions about the new requirements for apps that track users.

Please see attached screenshot for details.

「ATT 다이얼로그로 수집을 【허가하지 않는다】를 선택했음에도 불구하고 쿠키를 수집하고 있다」라는 통지.
당황해 스크린샷을 확인한 곳, 아무래도 UnityAds가 쿠키 수집하고 있는 것 같았습니다.

과연, 라는 것은 2개의 대응을 해야 합니다.
  • ATT 대화 상자에서 사용자가 선택한 결과를 얻습니다
  • 사용자가 선택한 결과에 따라 UnityAds의 표시 방법을 변경합니다

  • 그런데 무슨 일인가.

    iOS 14 Advertising Support 발견 → 구현



    유저의 ATT 선택 상황을 취득하는데 좋은 방법은 없을까라고 여러가지 조사한 결과, 아무래도 2021년 5월 주변에 Unity의 패키지에 「iOS 14 Advertising Support」라고 하는 패키지가 추가된 것 같습니다.

    패키지 관리자에서 설치하고 샘플을 읽고 구현합니다. 샘플에는 정중하게 ATT 다이얼로그 직전에 표시하는 다이얼로그도 붙어 왔습니다.

    우선 완성된 코드로는 이쪽↓

    Main.cs의 Start() 관련 처리 추출
    private IEnumerator Start()
    {
                :
        yield return SetupAttAndAdAsync();
                :
        //タイトル開始
        SetState<MainStateTitle>();
    }
    
    /// <summary>
    /// ATTとAdの準備
    /// </summary>
    /// <returns></returns>
    private IEnumerator SetupAttAndAdAsync()
    {
        //IOSはUnityAds初期化前にATT対応を終わらせておく
    #if UNITY_IPHONE || UNITY_IOS
        // check with iOS to see if the user has accepted or declined tracking
        var status = ATTrackingStatusBinding.GetAuthorizationTrackingStatus();
    
        //まだATT方針を決めていないなら
        if (status == ATTrackingStatusBinding.AuthorizationTrackingStatus.NOT_DETERMINED)
        {
            ここに、ダイアログを表示して、完了したら
                    OnClickCenterButtonAttDialog()
            を呼ぶ処理を書く
            iOS 14 Advertising Supportのサンプルが参考になるかと。
        }
    
        //実機の時だけ完了待ちをする
    #if !UNITY_EDITOR
        while (status == ATTrackingStatusBinding.AuthorizationTrackingStatus.NOT_DETERMINED)
        {
            status = ATTrackingStatusBinding.GetAuthorizationTrackingStatus();
            yield return new WaitForEndOfFrame();
        }
    #endif
    
    #else
        Debug.Log("Unity iOS Support: App Tracking Transparency status not checked, because the platform is not iOS.");
    #endif
    
        //広告の初期化
    #if UNITY_ANDROID || UNITY_IPHONE || UNITY_IOS
        Advertisement.AddListener(this);
        //gameId,testModeはご自身のアプリに合わせて
        Advertisement.Initialize(gameId, testMode);
        //バナーの初期化はご自身で実装してください↓
        yield return RequestBannerAsync();
    #else
        yield break;
    #endif
    }
    
    private void OnClickCenterButtonAttDialog()
    {
    #if UNITY_IPHONE || UNITY_IOS
        Debug.Log("Unity iOS Support: Requesting iOS App Tracking Transparency native dialog.");
        ATTrackingStatusBinding.RequestAuthorizationTracking();
    #else
        Debug.LogWarning("Unity iOS Support: Tried to request iOS App Tracking Transparency native dialog, but the current platform is not iOS.");
    #endif
    }
    

    포인트는
  • ATTrackingStatusBinding.RequestAuthorizationTracking();에서 ATT 대화 상자를 호출할 수 있다!
  • ATTrackingStatusBinding.GetAuthorizationTrackingStatus()로 ATT의 상태를 취득할 수 있다!
  • yield return 에서 state 변경 완료 대기!

  • 그렇죠?
    RequestAuthorizationTracking()을 사용하면 처음에 붙인 링크의 DLLImport 대응 등이 불필요하게 되므로 상당히 편해졌습니다.
    또 yield return new WaitForEndOfFrame(); 는, yield return null;이라도 좋을지도.
    자신이 구현했을 때는 new WaitWhile()이나 new WaitUntil()에서는 아무것도 잘 안 되었기 때문에, 만약 정보 있으면 받을 수 있으면 고맙습니다.

    UnityAds 쿠키 수집 표기 간 전환



    이제 위의 iOS 14 Advertising Support 패키지에서 ATT 상태를 얻을 수 있습니다.
    다음은 "그 정보를 바탕으로 UnityAds의 표시 전환을 한다"
    그래서 조사한 곳, 아래의 스레드를 발견했습니다.

    기사 엎드려 「GDPR의 표시를 시키지 않게 하면 된다」라는 것.
    또, 이를 위해서는 「Advertising의 초기화 전에 GDPR에 값(false)을 설정하면 된다」라고 한다.
    코드로서는 이런 느낌으로↓
    var gdprMetaData = new MetaData("gdpr");
    gdprMetaData.Set("consent", false);//falseは文字列で渡す
    Advertisement.SetMetaData(gdprMetaData);
    

    그래서 이전 코드를 수정합니다.

    Main.cs의 Start() 관련 처리 추출(GDPR 대응판)
    private IEnumerator Start()
    {
                :
        yield return SetupAttAndAdAsync();
                :
        //タイトル開始
        SetState<MainStateTitle>();
    }
    
    /// <summary>
    /// ATTとAdの準備
    /// </summary>
    /// <returns></returns>
    private IEnumerator SetupAttAndAdAsync()
    {
        //IOSはUnityAds初期化前にATT対応を終わらせておく
    #if UNITY_IPHONE || UNITY_IOS
        // check with iOS to see if the user has accepted or declined tracking
        var status = ATTrackingStatusBinding.GetAuthorizationTrackingStatus();
    
        //まだATT方針を決めていないなら
        if (status == ATTrackingStatusBinding.AuthorizationTrackingStatus.NOT_DETERMINED)
        {
            ここに、ダイアログを表示して、完了したら
                    OnClickCenterButtonAttDialog()
            を呼ぶ処理を書く
            iOS 14 Advertising Supportのサンプルが参考になるかと。
        }
    
        //実機の時だけ完了待ちをする
    #if !UNITY_EDITOR
        while (status == ATTrackingStatusBinding.AuthorizationTrackingStatus.NOT_DETERMINED)
        {
            status = ATTrackingStatusBinding.GetAuthorizationTrackingStatus();
            yield return new WaitForEndOfFrame();
        }
    #endif
    
      //追加部分ここから!!!!!!
      //ATT対応の結果を持って、Adを初期化しておかないとCookieの収集を行ってしまいリジェクトを食らってしまう
        var gdprMetaData = new MetaData("gdpr");
        //許可の時だけ true
        var isGdpr = ATTrackingStatusBinding.GetAuthorizationTrackingStatus() == ATTrackingStatusBinding.AuthorizationTrackingStatus.AUTHORIZED;
        gdprMetaData.Set("consent", isGdpr.ToString());
        Advertisement.SetMetaData(gdprMetaData);
        //追加部分ここまで!!!!!!
    
    #else
        Debug.Log("Unity iOS Support: App Tracking Transparency status not checked, because the platform is not iOS.");
    #endif
    
        //広告の初期化
    #if UNITY_ANDROID || UNITY_IPHONE || UNITY_IOS
        Advertisement.AddListener(this);
        //gameId,testModeはご自身のアプリに合わせて
        Advertisement.Initialize(gameId, testMode);
        //バナーの初期化はご自身で実装してください↓
        yield return RequestBannerAsync();
    #else
        yield break;
    #endif
    }
    
    private void OnClickCenterButtonAttDialog()
    {
    #if UNITY_IPHONE || UNITY_IOS
        Debug.Log("Unity iOS Support: Requesting iOS App Tracking Transparency native dialog.");
        ATTrackingStatusBinding.RequestAuthorizationTracking();
    #else
        Debug.LogWarning("Unity iOS Support: Tried to request iOS App Tracking Transparency native dialog, but the current platform is not iOS.");
    #endif
    }
    

    이제 ATT 허가시에만 GDPR에 true가 전달되고, 그렇지 않으면 false가 전달됩니다.
    원래 허가의 때는 값을 설정하지 않아도 좋을지도 모릅니다만, 그 근처는 좋은 느낌에 수정해 주는 방향으로…

    결론



    라고 하는 것으로, 상기의 코드를 더해 심사에 제출하는 것으로 리뷰를 통과할 수 있었습니다.
    어쩌면 언젠가는 UnityAds 내에서 마음대로 대응할 수 있을 때가 올지도 모릅니다만,
    좀처럼 조사에 시간이 걸렸기 때문에 만약을 위해 기사화해 둡니다.

    좋은 웹페이지 즐겨찾기