プログラミング

【iOS開発】ATT(AppTrackingTransparency)への対応

swift-eyecatch

先日iOS14.5へのアップデートがリリースされたことにともない、ATT(AppTrackingTransparency)がついにリリースされました。広告でなんとか細々と開発を続けているスタートアップや中小企業・個人開発者にとっては、広告収入が今後どうなっていくのかがとても心配ですよね。

Apple Developer Documentation

正直小さな開発企業にとって、これまでの広告の仕組みを十分に理解していなかったり、IDFAとは?といった状況の方が多いかと思います。

私自身もそこまで詳しいわけではなく、なんとかATT対応のリリースを先日行った状況です。今後の広告収入がどうなっていくのかは引き続きウォッチしていくとして、個人開発者としての私の対応例を記載します。

IDFAと広告収益

アプリ内にてGoogle AdmobFacebook Audience Networkなどで広告を埋め込むことで、広告が表示されたりクリックされたりすると開発者には広告収入が入ります。

この時、各ユーザーによりパーソナライズされた広告を表示するために、ユーザーを識別する広告識別子がIDFA(Identifier for Advetiser)です。

このIDFAにより、端末における各ユーザーの行動をトラッキングすることができ、よりユーザーの興味・関心に沿った広告を配信されるようになります。その結果、広告のクリック率が高くなることは想像できます。

今回のATT(AppTrackingTransparency)は、Appleのユーザーのプライバシーの観点から、IDFAを取得するには、ユーザーの許可を得ることが必須になりました。これまでのデフォルト設定では、IDFAはユーザーの許可なしに取得することができていました。

ATT対応としてユーザーに許可のポップアップを出すにしても、ユーザーがよくわからないものを許可するはずがありません。

「AppTrackingTransparency」(ATT)を通じてのアプリでのトラッキング許可カード表示で、ユーザーの88%は「Appにトラッキングしないように要求を選んでいる。」米Verizon傘下の広告分析企業Flurry AnalyticsがiOS 14.5リリースの4月26日(現地時間)から続けている「Daily Opt-in Rate After iOS 14.5 Launch」調査の結果から明らかになった。

なので今後徐々に、各ユーザーの端末がOS14.5以上にアップデートされることで、広告収益は減少していくことになると予想されます。

とはいえ、現時点でiOS開発者にとって出来ることはATT対応をして、ユーザーにIDFA許可を得る以外にありません。もしくは無料機能を絞りサブスクリプション等に転換することで広告収入から脱却することも方向性としてはあるかと思いますが、多くの開発者にとっては短期間で対応出来るものでもありません。

従って、広告収益を軸としているアプリの場合は、ひとまずATT対応した上で今後の方向性を徐々に検討しつつ対応していく、という流れが一般的だろうと思います。

中には、ATT対応はしてもほとんどのユーザーが許可しないから、対応せずにその労力を機能開発・改善に使うという方もいるようです。選択として間違っているとは全く思えません。

私個人としてはとりあえず対応してみたという状況なのでその対応内容を具体的に記載したいと思います。

ATT(AppTrackingTransparency)への対応方法

ATTに対応すること自体はそれほど難しくはありません。

  1. ポップアップ表示タイミングの選定
  2. ポップアップ文言の確定
  3. 事前のカスタマイズポップアップ導入検討(導入するならデザインと文言決定)
  4. 実装

対応の流れとしては、上記のようになるかと思います。

ポップアップ表示タイミングの選定

これは、例えばアプリを開いた直後やユーザーがアプリをインストールした直後に表示するのは得策ではないと考えています。通知許可やアプリの評価・レビューを促すタイミングと同様の考えで問題ありません。

ユーザーにある程度アプリの価値を体験してもらったタイミング、何かしらのアクションが完了したタイミングあたりが良いだろうと思います。

ポップアップ文言の確定

ATTのポップアップは、メッセージ部分は独自に設定することが可能です。しかし、許可しなければ機能を制限する、許可すれば報酬がある、など、許可するしないで機能を変更すると、Appleの審査でリジェクトされるようです。(中には審査を通過した例もあるようですが。)

3.2.2 許容されない行為(vi)
Appの機能やコンテンツへのアクセス、金銭その他の報酬を受け取るために行ってはいけないことに「追跡の有効化(enable tracking)」が追加

あくまで、広告の最適化あたりにとどめておくのが無難。

info.plistPrivacy - Tracking Usage Descriptionを設定します。

ちなみに、この文言をローカライズするには、InfoPlist.stringファイルを作成し、各ローカライズファイルに、NSUserTrackingUsageDescriptionを設定することで対応できます。

InfoPlist.stringファイルは、ファイルの新規作成からstringsファイルを選択して作成することになります。

事前のカスタマイズポップアップ

こちらは、ATTのポップアップを表示する直前に独自のポップアップを表示することで、ATTの内容をできるだけ正しく伝えたり許可率を上げるために、大手のアプリでは導入していることが多いかと思います。

TwitterがAppleのiOS 14におけるIDFAのアップデートに向けて準備していること

UIデザインの確定や実装も面倒ではありますが、文言の確定や多言語化などそのあたりのほうが面倒でした。

ATT実装サンプル

import Foundation
import AdSupport
import AppTrackingTransparency
import FBAudienceNetwork

struct AppTrackingManager {
    static func requestAppTracking() {
        if #available(iOS 14, *) {
            print("AppTracking: OVER iOS14")
            switch ATTrackingManager.trackingAuthorizationStatus {
            case .authorized:
                print("AppTracking: AUTHORIZED")
                print("AppTracking: IDFA: \(ASIdentifierManager.shared().advertisingIdentifier)")
            case .denied:
                print("AppTracking: DENIED")
            case .restricted:
                print("AppTracking: RESTRICTED")
            case .notDetermined:
                showRequestTrackingAuthorizationAlert()
            @unknown default:
                print("AppTracking: UNKOWN DEFAULT")
            }

        } else {
            print("AppTracking: UNDER iOS14")
            if ASIdentifierManager.shared().isAdvertisingTrackingEnabled {
                print("AppTracking: AUTHORIZED")
                print("IDFA: \(ASIdentifierManager.shared().advertisingIdentifier)")
            } else {
                print("AppTracking: RESTRICTED")
            }
        }

        UserDefaults.standard.setValue(true, forKey: UserDefaultsKey.isShowedAdTrackingPopup)
    }

    static func showRequestTrackingAuthorizationAlert() {
        if #available(iOS 14, *) {
            ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
                switch status {
                case .authorized:
                    print("AppTracking: AUTHORIZED")
                    print("AppTracking: IDFA: \(ASIdentifierManager.shared().advertisingIdentifier)")
                    FBAdSettings.setAdvertiserTrackingEnabled(true)
                case .denied, .restricted, .notDetermined:
                    print("AppTracking: NOT AUTHORIZED")
                    FBAdSettings.setAdvertiserTrackingEnabled(false)
                @unknown default:
                    print("AppTracking: UNKOWN DEFAULT")
                }
            })
        }
    }
}

ATTrackingManager.trackingAuthorizationStatus.notDeterminedならばATTrackingManager.requestTrackingAuthorizationをコールしてポップアップを表示する、というだけです。

その他、リリースに向けては微調整が必要かと思いますので、あくまでサンプルとして捉えていただければと思います。

あとは、ポップアップを表示したいタイミングで、AppTrackingManager.requestAppTracking()を呼びます。

実際には、事前ポップアップを表示したりしているので、もう少し複雑ですが、実装自体は上記のみで、ATTを対応するかしないか検討している開発者にとっては、特段難しい部分はないと思います。

FBAdSettingsはFacebook Audience Networkを導入している場合のみの対応です。
if #available(iOS 14, *)の部分はiOS 14.5としたほうが良いかもしれません。

以上です、まあしばらくは様子見ですね。今後全体的に、無料アプリの機能が少しずつ制限されていったりしそうですね。