AndroidとiOSをターゲットにするフラッター用のプッシャーチャネルクライアントプラグイン。 Pusher-Websocket-Java V2.2.5とPusher-Websocket-Swift v8.0.0をラップします。
チュートリアルやプッシャーチャネルに関する詳細な情報については、公式のドキュメントをご覧ください。
このクライアントは、公式のプッシャーサーバーとLaravel自己ホストのPusher Websocket Server(Laravel-Websockets)で動作します。
pubspec.yamlに追加します
dependencies :
pusher_client : ^2.0.0 Podfileの最小展開目標を9.0に設定します。 ios/Podfileに移動してから、この行を除外してください。
# platform :ios, '8.0'
に変更してください:
platform :ios, '9.0'
Laravel-Websocketsのようなローカルプッシャーサーバーを使用している場合は、プライベートチャネルを購読する問題がある場合がありますios/Runner/Info.plist
< key >NSAppTransportSecurity</ key >
< dict >
< key >NSAllowsArbitraryLoads</ key >
< true />
</ dict >どのドメインが接続して追加するかを知っている場合:
< key >NSAppTransportSecurity</ key >
< dict >
< key >NSExceptionDomains</ key >
< dict >
< key >example.com</ key >
< dict >
< key >NSExceptionAllowsInsecureHTTPLoads</ key >
< true />
< key >NSIncludesSubdomains</ key >
< true />
</ dict >
</ dict >
</ dict >R8またはProguardでコードの難読化を有効にしている場合は、 android/app/build.gradleに次のルールを追加する必要があります。
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile( ' proguard-android.txt ' ), ' proguard-rules.pro '
}
}その後、 android/app/proguard-rules.pro :
- keep class com.github.chinloyal.pusher_client .** { * ; } これが一言で言えばAPIです。
PusherOptions options = PusherOptions (
host : 'example.com' ,
wsPort : 6001 ,
encrypted : false ,
auth : PusherAuth (
'http://example.com/auth' ,
headers : {
'Authorization' : 'Bearer $ token ' ,
},
),
);
PusherClient pusher = PusherClient (
YOUR_APP_KEY ,
options,
autoConnect : false
);
// connect at a later time than at instantiation.
pusher. connect ();
pusher. onConnectionStateChange ((state) {
print ( "previousState: ${ state . previousState }, currentState: ${ state . currentState }" );
});
pusher. onConnectionError ((error) {
print ( "error: ${ error . message }" );
});
// Subscribe to a private channel
Channel channel = pusher. subscribe ( "private-orders" );
// Bind to listen for events called "order-status-updated" sent to "private-orders" channel
channel. bind ( "order-status-updated" , ( PusherEvent event) {
print (event.data);
});
// Unsubscribe from channel
pusher. unsubscribe ( "private-orders" );
// Disconnect from pusher service
pusher. disconnect ();
参照形式の詳細については、以下をご覧ください。
コンストラクターは、プッシャーチャネルダッシュボードのアプリのAPIアクセスセクションから取得できるアプリケーションキーとプッシャーオプションオブジェクトを取得します。
PusherClient pusher = PusherClient ( YOUR_APP_KEY , PusherOptions ());プライベート、存在感、または暗号化されたチャネルを使用する場合は、サブスクリプションを認証するときに使用するPusherAuthを提供する必要があります。これを行うには、 authセットがあるPusherOptionsオブジェクトを渡す必要があります。
PusherAuth auth = PusherAuth (
// for auth endpoint use full url
'http://example.com/auth' ,
headers : {
'Authorization' : 'Bearer $ token ' ,
},
);
PusherOptions options = PusherOptions (
auth : auth
);
PusherClient pusher = PusherClient ( YOUR_APP_KEY , options);ロギングを無効にして自動接続を行うには、これを行います。
PusherClient pusher = PusherClient (
YOUR_APP_KEY ,
options,
enableLogging : false ,
autoConnect : false ,
); Auto Connectが無効になっている場合、Pusherインスタンスでconnect()を使用して手動で接続できます。
このプラグインの機能のほとんどは、pusheroptionsオブジェクトを介して構成されています。プッシャークライアントに渡す前に、オブジェクトにパラメーターを設定して構成します。以下は、設定できるすべてのプロパティを含むテーブルです。
| 方法 | パラメーター | 説明 |
|---|---|---|
| 暗号化 | ブール | 接続をTLSで行うべきかどうか。 |
| 認証 | プシェラート | プライベート、プライベート暗号化、存在チャネルを認証するときに使用する許可オプションを設定します。 |
| ホスト | 弦 | 接続が行われるホスト。 |
| wsport | int | 暗号化されていない接続が行われるポート。自動的に正しく設定します。 |
| wssport | int | 暗号化された接続が行われるポート。自動的に正しく設定します。 |
| クラスタ | 弦 | クライアントが接続するクラスターを設定して、ホストとポートを正しく設定します。 |
| ActivityTimeOut | int | 「ping」がトリガーされる不活動のミリ秒数の数。接続を確認します。デフォルト値は120,000です。 |
| Pongtimeout | int | クライアントが切断する前にサーバーから「ポン」応答を受信するのを待つミリ秒数。デフォルト値は30,000です。 |
| MaxReconnectionAttempts | int | pusher.connect()が呼び出されたときに行われる再接続の試みの数、その後クライアントがgiveめます。 |
| MaxReconnectGapInseconds | int | 2つの再接続の遅延は、指数関数的に拡張されます(1、2、4、..秒)このプロパティは、2つの再接続試行の間に最大入力を設定します。 |
connect()メソッドは、接続が失われた場合、たとえばデバイスが受信を失った場合に再接続するためにも使用されます。接続が再確立されると、チャネルサブスクリプションとイベントバインディングの状態が保存され、サーバーと再交渉されます。
pusher. disconnect ();切断後、 PusherClientインスタンスは内部に割り当てられたリソース(スレッドとネットワーク接続)をリリースします
チャネルは、データを購読する方法としてチャネルの概念を使用します。それらは、単純な名前で識別および購読されます。イベントはチャネルにバインドされており、名前でも識別されます。
上記のように、チャネルサブスクリプションは、 PusherClientインスタンスによって1回だけ登録する必要があります。それらは切断全体に保存され、再接続時にサーバーを使用して再確立されます。それらを再登録すべきではありません。ただし、 connect最初の呼び出しの前に、 PusherClientインスタンスに登録される場合があります。接続が利用可能になるとすぐにサーバーが完成します。
チャネルにサブスクライブするデフォルトの方法には、クライアントオブジェクトのサブスクライブメソッドを呼び出すことが含まれます。
Channel channel = pusher. subscribe ( "my-channel" );これにより、 Channelオブジェクトが返され、イベントをバインドできます。
プライベートチャネルは、 「プライベート」ネームスペースに存在することを除いて、パブリックチャネルとまったく同じ方法で作成されます。これは、チャネル名のプレフィックスを意味します。
Channel privateChannel = pusher. subscribe ( "private-status-update" );プライベートチャネルへの購読には、クライアントが認証されます。詳細については、認証されたチャネルの例については、プッシャーコンストラクターセクションを参照してください。
プライベートチャネルと同様に、プライベート暗号化されたチャネルを購読することもできます。このプラグインは、エンドツーエンドの暗号化を完全にサポートします。これは、あなたとあなたの接続されたクライアントだけがあなたのメッセージを読むことができることを意味します。プッシャーはそれらを復号化することはできません。これらのチャネルには、「プライベートインクリプト化された」でプレフィックスする必要があります。
プライベートチャネルと同様に、認証エンドポイントを提供する必要があります。そのエンドポイントは、エンドツーエンドの暗号化をサポートするサーバークライアントを使用することでなければなりません。 nodejsの使用を検討するデモンストレーションエンドポイントがあります。
存在チャネルは、名前に「存在」が付いているチャネルです。プレゼンスチャネルも認証する必要があります。
Channel presenceChannel = pusher. subscribe ( "presence-another-channel" );チャネルサブスクリプションで発生するイベントには2つのタイプがあります。
Channel channel = pusher. subscribe ( "private-orders" );
channel. bind ( "order-status-updated" , ( PusherEvent event) {
print (event.data);
});あなたがバインドするコールバックはPusherEventを受け取ります:
| 財産 | タイプ | 説明 |
|---|---|---|
eventName | String | イベントの名前。 |
channelName | String | イベントがトリガーされたチャンネルの名前。 (オプション) |
data | String | triggerに渡されたデータは、文字列としてエンコードされています。オブジェクトを渡した場合、それは必要に応じて解析できるJSON文字列にシリアル化されています。 (オプション) |
userId | String | イベントをトリガーしたユーザーのID。これは、プレゼンスチャネルでトリガーされたクライアントイベントでのみ使用できます。 (オプション) |
イベントからバインドできます。
channel. unbind ( "order-status-updated" );プライベートまたはプレゼンスのサブスクリプションが承認され、サブスクリプションが成功すると、それらのチャネルでイベントをトリガーすることができます。
クライアントによってトリガーされたイベントは、クライアントイベントと呼ばれます。彼らは信頼されていないかもしれないクライアントからトリガーされているため、それらを使用する際に多くの強制ルールがあります。これらのルールのいくつかは次のとおりです。
channel. bind ( "pusher:subscription_succeeded" , ( PusherEvent event) {
channel. trigger ( "client-istyping" , { "name" : "Bob" });
});詳細については、クライアントイベントのドキュメントを参照してください。
接続したら、現在のクライアントの接続の一意の識別子にアクセスできます。これはソケットIDとして知られています。接続が次のように確立されたら、値にアクセスできます。
String socketId = pusher. getSocketId ();ソケットIDがある方法と理由の詳細については、ユーザーの認証と受信者を除外するドキュメントを参照してください。
iOSロギングは、Flutterコンソールに出力されていないようですが、Xcodeからアプリを実行すると、ログが表示されるはずです。
ローカルプッシャーサーバーを使用しているが、プライベートチャネルにサブスクライブできない場合は、iOS/runner/info.plistにこれを追加します。
< key >NSAppTransportSecurity</ key >
< dict >
< key >NSAllowsArbitraryLoads</ key >
< true />
</ dict >どのドメインが接続して追加するかを知っている場合:
< key >NSAppTransportSecurity</ key >
< dict >
< key >NSExceptionDomains</ key >
< dict >
< key >example.com</ key >
< dict >
< key >NSExceptionAllowsInsecureHTTPLoads</ key >
< true />
< key >NSIncludesSubdomains</ key >
< true />
</ dict >
</ dict >
</ dict >