React Nativeでの使用方法
React Nativeは、Reactとアプリプラットフォームのネイティブ機能を使用してAndroidおよびiOSアプリケーションを構築するためのオープンソースフレームワークです。React Nativeでは、JavaScriptを使用してプラットフォームのAPIにアクセスするだけでなく、再利用可能でネスト可能なコードのバンドルであるReactコンポーネントを使用してUIの外観と動作を記述します。
Reactガイドのすべてのヒントは、React Nativeにも適用できます。
接続URL
開発中にSocket.IOサーバーにアクセスするためのURLは、プラットフォームによって異なります。
| プラットフォーム | URL | 
|---|---|
| Webブラウザ | localhost | 
| iOSシミュレーター | localhost | 
| Androidシミュレーター | 10.0.2.2 | 
| 実機 | (同じネットワーク上にある場合)マシンのIPアドレス | 
実機での例
import { io } from "socket.io-client";
export const socket = io("http://192.168.0.10:3000");
ブラウザでアプリケーションを開発する場合、サーバー側でCORSを有効にする必要もあります。
const io = new Server({
  cors: {
    origin: ["https://:8081"],
  }
});
参考: CORSの処理
よくある問題
Androidでクリアテキストトラフィックがブロックされる
APIレベル28(Android 9以降)から、クリアテキストトラフィックはデフォルトでブロックされます。つまり、SSL(http://)なしでサーバーにアクセスできなくなります。
開発中にこれを許可するには、次の設定を追加できます。
- android:usesCleartextTraffic="true"を使用する方法
<?xml version="1.0" encoding="utf-8"?>
<manifest>
    <application
            android:usesCleartextTraffic="true"
    />
</manifest>
- または、ネットワークセキュリティ設定ファイルを使用する方法
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain>192.168.0.10</domain>
    </domain-config>
</network-security-config>
<?xml version="1.0" encoding="utf-8"?>
<manifest>
    <application
            android:networkSecurityConfig="@xml/network_security_config"
    />
</manifest>
参考: https://developer.android.com/privacy-and-security/security-config
自己署名証明書を使用する場合
次の設定で、自己署名証明書を使用してSocket.IOサーバーにアクセスできます。
<?xml version="1.0" encoding="utf-8"?>
<manifest>
    <application
            android:networkSecurityConfig="@xml/network_security_config"
    />
</manifest>
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!-- needed by the Metro dev server -->
    <domain-config cleartextTrafficPermitted="true">
        <domain>localhost</domain>
    </domain-config>
    <domain-config>
        <domain>192.168.0.10</domain>
        <trust-anchors>
            <certificates src="@raw/mycert" />
        </trust-anchors>
    </domain-config>
</network-security-config>
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
IPアドレスは、自己署名証明書の`subjectAltName`に含まれている必要があります。
$ openssl req -x509 -nodes \
  -newkey rsa:2048 \
  -out cert.pem \
  -keyout key.pem \
  -subj '/CN=localhost' \
  -addext 'subjectAltName = IP:192.168.0.10'
そうでない場合、クライアントは接続を確立できません。
次のコマンドで確認できます。
$ openssl x509 -in cert.pem -text -noout | grep X509v3 -A 1
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                C3:67:68:1A:F2:2C:F2:E8:B9:7A:7D:25:3F:5D:E0:AF:B5:B0:AF:16
            X509v3 Authority Key Identifier:
                C3:67:68:1A:F2:2C:F2:E8:B9:7A:7D:25:3F:5D:E0:AF:B5:B0:AF:16
            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Subject Alternative Name:
                IP Address:192.168.0.10
参考: https://developer.android.com/privacy-and-security/security-config
サンプルプロジェクト
- Expo Go: https://github.com/socketio/socket.io/tree/main/examples/expo-example
- React Native CLI: https://github.com/socketio/socket.io/tree/main/examples/ReactNativeExample
以上で終わりです。読んでいただきありがとうございます。