Funding Choices + UMPでiOS14のIDFA同意プロンプト周りを実装する

# iOS14リリースまでにIDFA対策が不可欠
iOS14がリリースされた時点で無対策だと、広告収益の損失が生じてしまう。

そのため、IDFA同意プロンプトを表示して同意を取得することが不可欠になった。
具体的には、
1. Xcode 12の導入
2. Google Mobile Ads SDK 7.64(2020-08-11公開)以降へのアップデート
3. App Tracking Transparencyによる同意プロンプトの実装
が求められる。

# Funding ChoicesとUMP
3の同意プロンプトに関して、ユーザに事前説明を噛ませたほうが効果的です。
自前実装することもできますが、Googleが任意導入の仕組みを提供しています。Funding Choicesサービスを使うと、ユーザに分かりやすい説明を表示した上で、同意プロンプトを求める仕組みを簡単に組み込めます。実装面では、User Messaging Platform(UMP)フレームワークを使います。
https://support.google.com/fundingchoices/answer/9180084

## 何を実現できるのか
1. iOS14のIDFA同意プロンプトの説明メッセージを事前に表示できる。メッセージはコンソールで指定してカスタマイズできる。
2. IDFA同意プロンプトを呼ぶ実装をframeworkに隠蔽できる。OS versionによる分岐を書かなくてよい。
3. GDPR対策も兼ねてくれる。

## 利用可能になる時期
サービス自体は2020年8月13日から提供されているので、すでに利用できる。ただし、IDFA同意プロンプトの前に説明メッセージが表示されるようになるのは、９月中旬から。(2020/08/20追記: 当初テスト環境のに事前メッセージを表示できると認識していましたが、同意プロンプトがトリガーされることをもって実装をテストできるよいうだけで、本番環境と同じで事前説明は9月まで表示されないのだという理解になりました。)それまでの期間は、同意プロンプトだけ表示される。それ以後は自動的に説明メッセージが表示されるとのこと。https://support.google.com/fundingchoices/answer/9997151

全速力で開発中なんでしょうね。

## 導入方法
1. Admob(あるいはアドマネージャー)からファンディングチェイスのアカウントを作る。規約に同意する。
2. 対象アプリを選択。
3. IDFAメッセージを指定する。カスタマイズできるが、ユーザデータの使用方法とIDFA同意をするための方法の詳細を含める。https://support.google.com/fundingchoices/answer/9180084 ただし現状まだメッセージを設定できないようです。
4. UMP(User Messaging Platform)を組み込む。つまり、GoogleUserMessagingPlatformをPodsなどで導入。GADApplicationIdentifierやNSUserTrackingUsageDescriptionをInfo.plistに指定。

### UMPの実装
ドキュメントはobjcのみなので、Swiftで同じようなコードを書いてみました。

なぜかドキュメントにないけど、まずimportが必要です。https://developers.google.com/admob/ump/ios/quick-start

```.swift
import UserMessagingPlatform
```

最新の同意情報を取得する。

```.swift
        let parameters = UMPRequestParameters()
        parameters.tagForUnderAgeOfConsent = false
        UMPConsentInformation.sharedInstance.requestConsentInfoUpdate(with: parameters) { error in
            guard error == nil else {
                // TODO: エラーハンドリング
                return
            }
            if UMPConsentInformation.sharedInstance.formStatus == .available {
                self.loadForm()
            }
        }

```

```.swift
    func loadForm() {
        UMPConsentForm.load { (form, loadError) in
            guard loadError == nil, let form = form else {
                // TODO: エラーハンドル
                return
            }
            guard UMPConsentInformation.sharedInstance.consentStatus == .required else {
                // ユーザの同意変更のためにフォームを利用できる状態を保つ
                return
            }
            form.present(from: self) { dismissError in
                guard dismissError == nil, UMPConsentInformation.sharedInstance.consentStatus == .obtained else {
                    // TODO: エラーハンドル
                    return
                }
                // 同意プロンプト選択後ここに来るので、アプリが広告の要求を開始する
            }
        }
    }
```

## EUやカリフォルニアへの対応
EEAユーザでない場合やEEAだがGDPRに既に同意している場合は、説明メッセージを表示する。EEAかつGDPRに未同意の場合は、EUユーザへの同意メッセージがIDFA説明メッセージより優先される。重ねて表示されない。https://support.google.com/fundingchoices/answer/9997151

GDPRメッセージをコンソールから簡単に登録できる。内容はテンプレートが自動的に挿入されるので、設定者はボタン色やフォントを選ぶ。

説明メッセージは、カリフォルニアのユーザへのオプトアウトにも対応とドキュメントに書いてあるが、コンソール画面では特に設定する項目が見当たらない。

## 広告ブロックしているユーザへの対応
広告ブロックを検出して、広告許可かContributorパスの購入(あるいはサブスク購入)
を求めるメッセージを表示できる。ただし、Contributorパス購入は、一部アカウントでは利用できないとされ、Google担当者に問い合わせないと実装できない。
https://support.google.com/fundingchoices/answer/9180084

## 言語対応
1言語に1メッセージ。ただし、日本語に対応しているのは、現状、広告ブロッカーメッセージのみ。

EU同意やカリフォルニアオプトアウトを日本語で見たい人はあまりいないはずなので、問題ないでしょうね。

現状、IDFAメッセージはプレースホルダしか登録できないため、米国英語でしか設定できません。そもそもメッセージを登録できない。

## レポート
メッセージのコンバージョン率、エンゲージメント、ページビューを確認できる。

# 雑感
自前実装するほうが細かいハンドリングがしやすい反面、業界標準の見た目のほうがユーザに安心感を与えること、レポートまでパッケージされていること、OS versionによる分岐の実装をframework側に閉じ込められるから、Funding Choiceを使いたい気持ちが出てきました。
多言語リソースを指定するのは一苦労ですね。

まだ自分がよく把握できていないのが、PersonalizedAdConsentとFunding Choices+UMPの関係です。Funding ChoicesがGDPR対策も兼ねているようなので、PersonalizedAdConsentは削除すべきなのかなと想像していますが、穴がないのか要検討です。


# 関連リンク
Google Mobile Ads SDK リリースノート
https://developers.google.com/admob/ios/rel-notes?hl=ja

Funding Choices
https://support.google.com/fundingchoices/