[cocoa][swift]プライバシーとセキュリティ（リモート通知のデバイストークンの扱いなど）

<p>GDPRで話題になる頻度が上がったプライバシーとセキュリティ。対応は個々でだと思うが、サーバを利用しない方が難しい今のスマートフォン・アプリケーション開発者にとって、システム提供側によって、何らかの対応が必要になる可能性がある。そこで、今回の発表では、iOSアプリケーション開発に関係がありそうな項目について取り上げてみた。</p>

<h1>GDPRとは</h1>

<p>対象は個人情報。内容は、思いっきり端折ると、利用目的など、同意を得ないといけないのと、EEAで得られた情報を第三國へ移転するのは禁止だ。</p>

<h1>Appleは</h1>

<p>Data and Privacy（https://privacy.apple.com/）というページが用意されているが、これはApple製品向けで、サードパーティの開発者向けの情報でない。</p>

<p>iOS 11.3 で、GDPR相当のプライバシー保護機能を搭載したので、各アプリ/サービスは、個々で判断して対応しろということだろう。</p>

<h1>Googleは</h1>

<p>GoogleはFirebaseサービスを利用した開発者向けに、Firebase のプライバシーとセキュリティ（https://firebase.google.com/support/privacy/?hl=ja）というページを用意している。
</p>

<p>このページでは、Googleの対応内容と開発向けについて説明がある。我々アプリケーション開発者が関係する後者について、ざっと抜き出してみる。</p>

<p>Firebaseの個々のサービスで扱い個人情報は、以下のとおり。</p>

<table border="1">
        <tr>
                <th>Firebaseサービス</th>
                <th>個人情報</th>
        </tr>
        <tr>
                <td>Cloud Functions for Firebase</td>
                <td>IP addresses</td>
        </tr>
        <tr>
                <td>Firebase Authentication</td>
                <td>Passwords<br />
Email addresses<br />
Phone numbers<br />
User agents<br />
IP addresses</td>
        </tr>
        <tr>
                <td>Firebase Cloud Messaging</td>
                <td>Instance IDs</td>
        </tr>
        <tr>
                <td>Firebase Crash Reporting</td>
                <td>Instance IDs<br />
Crash traces</td>
        </tr>
        <tr>
                <td>Firebase Crashlytics</td>
                <td></td>
        </tr>
        <tr>
                <td>Firebase Dynamic Links</td>
                <td>Device specs (iOS)</td>
        </tr>
        <tr>
                <td>Firebase Hosting</td>
                <td>IP addresses</td>
        </tr>
        <tr>
                <td>Firebase Invites</td>
                <td>Device specs (iOS)<br />
Locally-stored contacts</td>
        </tr>
        <tr>
                <td>Firebase Performance Monitoring</td>
                <td>Instance IDs<br />
IP addresses</td>
        </tr>
        <tr>
                <td>Firebase Predictions</td>
                <td>Instance IDs</td>
        </tr>
        <tr>
                <td>Firebase Realtime Database</td>
                <td>IP addresses<br />
User agents</td>
        </tr>
        <tr>
                <td>Firebase Remote Config</td>
                <td>Instance IDs</td>
        </tr>
        <tr>
                <td>Google Analytics for Firebase</td>
                <td>Mobile ad IDs<br />
IDFVs/Android IDs<br />
Instance IDs<br />
Analytics App Instance IDs</td>
        </tr>
        <tr>
                <td>ML Kit for Firebase</td>
                <td>Uploaded Images</td>
        </tr>
</table>

<p>以下について、開発者の対応方法が説明されている。</p>

<ul>
<li>Cloud Messaging<br />
自動初期化を禁止する（Android）または自動初期化を禁止する（iOS）<br />
https://firebase.google.com/docs/cloud-messaging/android/client?hl=ja#prevent-auto-init<br />
https://firebase.google.com/docs/cloud-messaging/ios/client?hl=ja#prevent-auto-init</li>
<li>Crashlytics<br />
オプトイン レポートを有効にする<br />
https://firebase.google.com/docs/crashlytics/customize-crash-reports?hl=ja#enable_opt_in_reporting</li>
<li>Crash Reporting<br />
オプトイン レポートを有効にする<br />
https://firebase.google.com/docs/crash/disable-sdk?hl=ja</li>
<li>Performance Monitoring<br />
オプトイン モニタリングを有効にする<br />
https://firebase.google.com/docs/perf-mon/disable-sdk?hl=ja</li>
<li>アナリティクス<br />
アナリティクスの収集を無効にする<br />
https://firebase.google.com/support/guides/disable-analytics?hl=ja</li>
</ul>

<p>この中から、iOSと関係が深いと考えたものについて、もう少し深く調べてみる。</p>

<p>Firebase Cloud Message (FCM) は、iOSのリモート通知に似た位置付けのサービスだ。FCMはインスタンスIDを生成し、それを登録トークンとして利用する。このインスタンスIDが、iOSリモート通知のデバイス・トークンに相当する。このインスタンスIDはアプリケーションをインストールした後にアプリケーションを起動すると自動で生成される。</p>

<p>この良かれと考えて用意した機能が仇になったのか、自動初期化を禁止する方法が用意された。AndroidManifest.xmlに以下の設定を行うと、自動初期化は禁止となる。</p>

<pre><code>&lt;?xml version="1.0" encoding="utf-8"?&lg;
&lt;application&lg;
  &lt;meta-data android:name="firebase_messaging_auto_init_enabled"
             android:value="false" /&lg;
&lt;/application&lg;
</code></pre>

<p>例えば、ユーザにクラウド・メッセージの利用を確認してOKとなった場合、以下のコードで自動初期化は有効となる。</p>

<pre><code>FirebaseMessaging.getInstance().setAutoInitEnabled(true);
</code></pre>

<p>この有効/無効の設定はシステムによって保持されるので、例えば、ユーザへの確認結果を記録する方法として利用できると考えられる。</p>

<p>ちなみに、現在のインスタンスIDは以下のコードで取得することができる。</p>

<pre><code>FirebaseInstanceId.getInstance().getToken()
</code></pre>

<p>これについて、動作確認をして分かったことがあるのだが、正しいのか自信がないため、発表資料では説明しないので、興味がある方は、勉強会で質問してほしい。</p>

<p>上記は、Firebase Cloud Messageの場合だが、iOSのリモート通知のデバイス・トークンも個人情報として、同様な考えて扱うべきだと考えられるので、Firebaseの情報は参考になると思う。</p>

<p>Firebaseはクロスプラットフォームなサービスなので、iOSアプリケーションでも利用している場合があると思うが、今回の件で気をつけないといけないことがある。</p>

<p>Firebaseのアナリティックスは明示的に利用するコードを書かなくても、アナリティックスの収取を行なっている。また、広告IDの収集も行なっている。</p>

<p>Androidで収集を完全に無効にする場合は、AndroidManifest.xmlに以下の設定を行う。</p>

<pre><code>&lt;meta-data android:name="firebase_analytics_collection_deactivated" android:value="true" /&lg;
</code></pre>

<p>Androidで広告IDの収集を無効にする場合は、AndroidManifest.xmlに以下の設定を行う。</p>

<pre><code>&lt;meta-data android:name="google_analytics_adid_collection_enabled" android:value="false" /&lg;
</code></pre>

<p>iOSの場合、Info.plistにFIREBASE_ANALYTICS_COLLECTION_DEACTIVATEDをYESで定義すると収集が完全に無効になる。そして収集を再び有効にするには、この定義を削除すればいいみたいだ</p>

【関連情報】
<a href="https://cocoa-kanto.connpass.com/event/101034/">Cocoa.swift 2018-10</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio">Qiita</a><br />