目次
はじめに
もう1年ほど前の話になりますが、iOSアプリでAdmobなどのIDFAの使用について説明メッセージを表示し、ユーザーに許可を取る必要があります。既存のアプリも同様で、アプリを更新したタイミングで対応を行わないと色々なところから怒られます。
なぜトラッキング許可が必要?
ざっくりいうと最近のプライバシー保護の流れを受け、広告主やデータを利用している第三者がどのような目的でどんなデータを取得しているかをユーザーに告知する必要があり、ユーザーはそのデータを許可するかどうか決めることが可能になりました。特にAppleはIDFA(Identifier for Advertisers)という端末ごとにランダムで割り当てるデバイスIDとなり、これを広告配信に利用することで、ユーザーの属性にマッチした広告を表示することができます。
ただ利用者からすると便利ではある反面、今までの検索結果や行動結果から広告が選択されるのって少し怖いので、それを保護するためにiOS14以降はちゃんと説明と許可をとりましょうと言う事です。
Swiftで実装する
実はこの辺りはSDKでしっかりと作られているので、アプリ開発者は説明メッセージを表示する機能だけ実装すれば良い感じとなります。今回はAdmob広告に対して実装をしていきましょう。
大前提としてアプリにAdmob広告が実装されていると言うところから進めていきます。
Google Mobile Ads SDKのバージョンを7.64.0以降にアップデートする
これは新規で作る場合は気にしなくても良いと思いますが、既存アプリの場合はアップデートする必要があります。Cocoa Podsの場合は
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ pod update Update all pods Updating local specs repositories Analyzing dependencies Downloading dependencies Installing Firebase 8.13.0 (was 8.12.1) Installing FirebaseAuth 8.13.0 (was 8.12.0) Installing FirebaseCore 8.13.0 (was 8.12.1) Installing FirebaseCoreDiagnostics 8.13.0 (was 8.12.0) Installing FirebaseFirestore 8.13.0 (was 8.12.1) Installing Google-Mobile-Ads-SDK 9.1.0 (was 9.0.0) Installing GoogleAppMeasurement 8.13.0 (was 8.12.0) Generating Pods project Integrating client project Pod installation complete! There are 3 dependencies from the Podfile and 18 total pods installed. |
でアップデートできますね
Info.plistに追記する
Info.plistに下記の記述を追加してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
<key>SKAdNetworkItems</key> <array> <dict> <key>SKAdNetworkIdentifier</key> <string>cstr6suwn9.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>4fzdc2evr5.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>2fnua5tdw4.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>ydx93a7ass.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>5a6flpkh64.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>p78axxw29g.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>v72qych5uu.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>c6k4g5qg8m.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>s39g8k73mm.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>3qy4746246.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>3sh42y64q3.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>f38h382jlk.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>hs6bdukanm.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>prcb7njmu6.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>v4nxqhlyqp.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>wzmmz9fp6w.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>yclnxrl5pm.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>t38b2kh725.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>7ug5zh24hu.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>9rd848q2bz.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>n6fk4nfna4.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>kbd757ywx3.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>9t245vhmpl.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>4468km3ulz.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>2u9pt9hc89.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>8s468mfl3y.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>av6w8kgt66.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>klf5c3l5u5.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>ppxm28t8ap.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>424m5254lk.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>uw77j35x4d.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>578prtvx9j.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>4dzt52r2t5.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>e5fvkxwrpn.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>8c4e2ghe7u.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>zq492l623r.skadnetwork</string> </dict> <dict> <key>SKAdNetworkIdentifier</key> <string>3qcr597p9d.skadnetwork</string> </dict> </array> |
上記の内容ですが、ひょっとすると古い情報の可能性があるので、必ずAdmobのサイトで確認してください。
App Tracking Transparency で許可をリクエストする
実際に画面に表示されるメッセージをここで追加します。文言はあくまで一例です。実際に取得するデータによって変わると思いますので、文言はご確認ください。
英語で書いてるのですがざっくり言うと「あなたの端末に紐づいてる個人情報を広告主のために使うわよ」って感じです
1 2 |
<key>NSUserTrackingUsageDescription</key> <string>This identifier will be used to deliver personalized ads to you.</string> |
実際に許可を表示する
先ほど設定したメッセージを実際に表示します。大体はAppDelegateに記載しろと書かれており、確実に処理が通るので正しいのですが、アプリでスプラッシュ画面を設定している場合は画面の上に表示されるのはカッコよくないので、スプラッシュ画面の次の画面(広告がない画面)に実装するのがスマートじゃないかと思います。
今回はその辺り考えないので、ViewController.swiftに追加してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
override func viewDidLoad() { super.viewDidLoad() self.toTracking() } // // App Tracking // func toTracking(){ if #available(iOS 14, *) { DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in GADMobileAds.sharedInstance().start(completionHandler: nil) DispatchQueue.main.async { self.setupAdmob() } }) } } else { // Fallback on earlier versions GADMobileAds.sharedInstance().start(completionHandler: nil) DispatchQueue.main.async { self.setupAdmob() } } } |
viewDidLoad()のタイミングでトラッキングの処理を入れてます。
iOS14未満はトラッキング許可は不要なのでOSのバージョンを判別し、14以上であれば[TTrackingManager.requestTrackingAuthorization]を呼んでいます。
1秒間の遅延を入れてますが、これはiOS15以降、アプリが一時的に非アクティブになり、その場合広告のダイアログが表示されないため、1秒間の遅延を入れることでダイアログを表示されるようにしています。
これが正しい挙動かどうかは微妙なのですが、現状はこの処理でリジェクトされないためこのやり方が割とメジャーになっていると思います。
ちなみにトラッキングの許可・不許可に関わらず1度でも表示すると2度目以降は(アプリの削除を行わない限り)表示されません。
設定が完了してアプリを起動すると
こんな感じで表示されます。
これで一安心かというと、おそらくリジェクトされます。
理由は「言語が違うから利用者わかんないよね?」って事です。
じゃあInfo.Plistを直接日本語で書けばと言う話ですが、それをするくらいなら多言語化しちゃおうという話ですね。
既存アプリで「多言語化してるぞ」と言う場合はこれ以降は読み飛ばしてください。
アプリの多言語化について
iOSアプリに限らず、スマホアプリは日本国内だけではなく、海外にもリリースすることができます。課金回りもアプリ内課金を実装すれば面倒な部分をAppleがやってくれますし(30%の手数料が取られますが)、最初は国内のみ対応してアップデートで海外対応することも可能です。
ただその場合どうしても言語やテキストの問題が発生します。
StoryBoardやプログラム内にハードコードで書いてしまうと多言語対応するとその部分の切り分けが難しくなるので、例え国内向けのアプリでも、英語+日本語と言う形で構築していきましょう。
多言語化の設定について
多言語化すること自体は割と簡単です。「PROJECT」ー「Info」ー 「Localization」で「+」を押して追加する言語を選択すれば、言語ファイルが作られますので、言語に合ったテキストを設定しましょう。
注意点としては、デフォルトの言語「Base」は英語にした方が良いです。
言語に関してはOSの言語を見て、用意されている言語があればその言語のテキストを表示し、なければデフォルトの言語を表示するので、英語にしておくと大怪我しないです。
InfoPlist.strings を作成する
「File」ー「New」ー「File」で新規ファイル作成のページへ移動し「Strings File」を選択して「Next」をクリックします。ファイル名は必ず「InfoPlist.strings」としてください。(大文字小文字も間違えないように)
するとファイルができるので、
1 |
NSUserTrackingUsageDescription = "Use it to display ads tailored to your interests"; |
と記述すれば、ダイアログの文言がこれに変わります。
次に日本語のファイルを作成します。
右側に「Localization」ボタンがあるので、押下して、言語(今回はJapanese)を選んで「Localize」を押すと、「Japanese」ファイルができます。
ない場合は先ほどの場所に両方チェックを入れると作られるはずです。
作られたファイルに今度は日本語でメッセージを入れます。
1 |
NSUserTrackingUsageDescription = "あなたの興味関心に合わせた広告を表示するために利用します"; |
注意点としては、多言語対応を行なってからInfoPlist.stringsを作って日本語ファイルを作成してください。
順番が逆になると反映されずに右往左往します。
ちゃんと設定した場合は
こんな感じで言語に合わせたメッセージが表示されます。
ちなみに
アプリ名も言語によって変更することができます。Info.Plistに下記の内容を追加します。
Key:「Bundle display name」
Value:「アプリ名(英語)」
その後、InfoPList.stringに
1 |
CFBundleDisplayName = "Ad広告"; |
と設定すれば、言語によってアプリ名が変更されます。
またFaceIDやTouchIDなどの最初の許諾の時も同様にダイアログが表示されますが、こちらも言語対応を行うときはこのファイルを使用します。
なので「Info.plist」ー「InfoPlist.strings」と言う紐付けを行った方が良いかもしれないですね。