Oculus Store 申請時の 'Enable Android NSC to Prevent Cleartext Traffic' という警告への対処方法

#追記

コメ欄で @shiena さんがよりスマートな対策方法を教えてくれました:bangbang: :bow: 

**Oculus Integration v1.41** 以降は OVRManager の Security の
`Enable NSC Configuration` へチェックを入れるだけで対策出来そうでした :white_check_mark: 
(全ての通信で HTTPS を強要されるため、アプリによっては後述の対策が必要になります)

基本的に Security の項目は `Disable Backups` も含めて
全てのチェックボックスをオンにしておいたほうが無難そうです :thumbsup:  [^1]

<img width="348" alt="スクリーンショット 2019-10-26 9.35.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86070/8b143186-5cf1-430c-a24e-d3d514de8654.png">

もし一部の通信では HTTP 通信を使いたい等、細かく通信周りの制御を行う必要がある場合は、
`/Assets/Oculus/VR/Editor/network_sec_config.xml` に該当ファイルが存在するので、
内容を書き換えることで NSC の詳細設定を行うことが可能です :arrow_down:

<img width="225" alt="スクリーンショット 2019-10-26 9.43.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86070/dba696c1-5d84-dac5-f1ca-840e59081992.png">

NSC で設定可能な項目については、
[ネットワーク セキュリティ構成 | Android Developers](https://developer.android.com/training/articles/security-config.html) をご参照くださいませ :mag: 

#はじめに

Quest アプリを Oculus Store に提出する際に警告が出てきてしまいました。。:weary: 
警告内容を見ると、ネットワークのセキュリティ設定に関するものでした :arrow_down: 

> The app has not enabled Android N's Network Security Configuration(https://developer.android.com/training/articles/security-config.html) feature, which forces the use of encryption (HTTPS) for all of the app's connections. The feature will block most cleartext HTTP traffic initiated by the app, which helps ensure that all data to and from the app has a base level of protection at all times.

対処方法を調べた所、
どうやら [network_security_config.xml](https://developer.android.com/training/articles/security-config.html) というファイルをプロジェクトに追加することで対策可能そうでした :thumbsup: 

そこで、
今回は [network_security_config.xml](https://developer.android.com/training/articles/security-config.html) の追加手順 & 設定方法について書いていきます :pencil: 

# network_security_config.xml をプロジェクトに追加する

追加するフォルダは `/Assets/Plugins/Android/res/xml` になります :arrow_down: 

```xml:/Assets/Plugins/Android/res/xml/network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!-- サブドメイン含む nikaera.com 以外のアクセスには HTTPS 通信が必須とする -->
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">nikaera.com</domain>
    </domain-config>
</network-security-config>
```

`network_security_config.xml` に記載する内容はプロジェクトによって異なると思いますが、
私の場合は特定ドメイン以外のアクセスには HTTPS 通信を必須とするよう設定しました :gear: 

# AndroidManifest.xml に network_security_config.xml を利用することを宣言する

プロジェクトに `network_security_config.xml` の内容を反映させるには、
`AndroidManifest.xml` に 1行設定に必要な記述を追加する必要あります :writing_hand: 

```xml:/Assets/Plugins/Android/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest>
...
    <!-- android:networkSecurityConfig の設定を application タグに追加する -->
    <application
        android:networkSecurityConfig="@xml/network_security_config">
...
    </application>
...
</manifest>
```

`AndroidManifest.xml` の `application` タグに `android:networkSecurityConfig` 属性を追加し、
`network_security_config.xml` のファイルパスを指定することで設定が有効となります :white_check_mark: 

この状態でビルドを行い APK の動作に問題が無いこと確認出来次第、
Oculus Store に再度アップロードしてみると、警告が無くなっていることが確認できるはずです :thumbsup: 

#おわりに

今回は `Enable Android NSC to Prevent Cleartext Traffic` の対処法について紹介しました :hand_splayed: 

実は他にも警告が出ているのですが、どうやらどれも Android に関わるもののようで、
Oculus Store 申請時は、「ココらへんも気をつけないといけないんだなあ」と思いました。。 :skull:

#参考リンク

- [ネットワーク セキュリティ構成 | Android Developers](https://developer.android.com/training/articles/security-config.html)
- [Android PでtargetSdkVersionを28に指定した場合にHTTP通信が失敗する] (https://qiita.com/superman9387/items/7441998138a8509537a4)

[^1]: AndroidManifest.xml の allowBackup 項目に false が設定されるようになり、APK アップロード時の警告を更に 1つ減らすことが出来ます :thumbsup: