Un complemento cliente de canales de empuje para Flutter dirigido a Android e iOS. Envuelve el empujador-websocket-java v2.2.5 y el swift de pusher-websocket v8.0.0.
Para obtener tutoriales e información más profunda sobre los canales de empuje, visite los documentos oficiales.
Este cliente trabaja con los servidores oficiales de empuje y el servidor WebSocket de Laravel egoísta (Laravel-Websockets).
Agregue a su pubspec.yaml
dependencies :
pusher_client : ^2.0.0 Establezca el objetivo de implementación mínimo en el PODFILE en 9.0. Vaya a ios/Podfile , luego descomné esta línea:
# platform :ios, '8.0'
Cambiarlo a:
platform :ios, '9.0'
Es posible que tenga un problema suscribiéndose a canales privados si está utilizando un servidor de empuje local como Laravel-Websockets, para solucionar esto, vaya a ios/Runner/Info.plist y agregue:
< key >NSAppTransportSecurity</ key >
< dict >
< key >NSAllowsArbitraryLoads</ key >
< true />
</ dict >Si sabe qué dominios se conectará a agregar:
< key >NSAppTransportSecurity</ key >
< dict >
< key >NSExceptionDomains</ key >
< dict >
< key >example.com</ key >
< dict >
< key >NSExceptionAllowsInsecureHTTPLoads</ key >
< true />
< key >NSIncludesSubdomains</ key >
< true />
</ dict >
</ dict >
</ dict > Si ha habilitado la ofuscación del código con R8 o Proguard, debe agregar la siguiente regla en android/app/build.gradle :
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile( ' proguard-android.txt ' ), ' proguard-rules.pro '
}
} Luego en android/app/proguard-rules.pro :
- keep class com.github.chinloyal.pusher_client .** { * ; } Aquí está la API en pocas palabras.
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 ();
Se puede encontrar más información en formato de referencia a continuación.
El constructor toma una clave de aplicación que puede obtener de la sección de acceso API de la aplicación en el tablero de canales de empuje y un objeto de opciones de empuje.
PusherClient pusher = PusherClient ( YOUR_APP_KEY , PusherOptions ()); Si va a utilizar canales privados, de presencia o cifrados, deberá proporcionar un PusherAuth para que se use al autenticar suscripciones. Para hacer esto, debe pasar un objeto PusherOptions que ha tenido un conjunto de auth .
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);Para deshabilitar el registro y la conexión automática, haga esto:
PusherClient pusher = PusherClient (
YOUR_APP_KEY ,
options,
enableLogging : false ,
autoConnect : false ,
); Si Auto Connect está deshabilitado, puede conectarse manualmente usando connect() en la instancia de empuje.
La mayor parte de la funcionalidad de este complemento se configura a través del objeto Pusheroptions. Lo configura configurando los parámetros en el objeto antes de pasarlo al cliente de empuje. A continuación se muestra una tabla que contiene todas las propiedades que puede establecer.
| Método | Parámetro | Descripción |
|---|---|---|
| encriptado | bool | Si la conexión debe hacerse con TLS o no. |
| auténtico | Pusherauth | Establece las opciones de autorización que se utilizarán al autenticar los canales privados, privados y de presencia. |
| anfitrión | Cadena | El host al que se realizarán las conexiones. |
| wsport | intencionalmente | El puerto al que se realizarán conexiones no cifradas. Configurado automáticamente correctamente. |
| WSSPORT | intencionalmente | El puerto al que se realizarán conexiones cifradas. Configurado automáticamente correctamente. |
| grupo | Cadena | Establece el clúster al que se conectará el cliente, configurando así el host y el puerto correctamente. |
| actividad tiempo | intencionalmente | El número de milisegundos de inactividad en los que se activará un "ping" para verificar la conexión. El valor predeterminado es de 120,000. |
| pongtimeout | intencionalmente | El número de milisegundos que el cliente espera para recibir una respuesta "pong" del servidor antes de desconectarse. El valor predeterminado es de 30,000. |
| MaxReconnectionAttempts | intencionalmente | Se llama número de intentos de reconexión que se realizarán cuando pusher.connect() , después de lo cual el cliente se rendirá. |
| MaxReconnectGapInseconds | intencionalmente | El retraso en dos reconexiones se extiende exponencialmente (1, 2, 4, .. segundos) Esta propiedad establece el máximo entre dos intentos de reconexión. |
El método connect() también se usa para volver a conectarse en caso de que la conexión se haya perdido, por ejemplo, si un dispositivo pierde la recepción. Tenga en cuenta que el estado de las suscripciones del canal y los enlaces de eventos se conservarán mientras se desconectarán y se vuelve a negociar con el servidor una vez que se restablezca una conexión.
pusher. disconnect (); Después de la desconexión, la instancia PusherClient lanzará cualquier recurso asignado internamente (hilos y conexiones de red)
Los canales utilizan el concepto de canales como una forma de suscribirse a los datos. Se identifican y se suscriben por un nombre simple. Los eventos están vinculados a un canal y también se identifican por nombre.
Como se mencionó anteriormente, las suscripciones de canales solo deben registrarse una vez por la instancia PusherClient . Se conservan a través de la desconexión y se restablecen con el servidor en Reconext. No deben volver a registrarse. Sin embargo, pueden estar registrados con una instancia PusherClient antes de la primera llamada para connect : se completarán con el servidor tan pronto como esté disponible una conexión.
El método predeterminado para suscribirse a un canal implica invocar el método de suscripción de su objeto cliente:
Channel channel = pusher. subscribe ( "my-channel" ); Esto devuelve un objeto Channel , a qué eventos pueden estar vinculados.
Los canales privados se crean exactamente de la misma manera que los canales públicos, excepto que residen en el espacio de nombres 'privado' . Esto significa prefijo el nombre del canal:
Channel privateChannel = pusher. subscribe ( "private-status-update" );Suscribirse a canales privados implica que el cliente esté siendo autenticado. Consulte la sección Constructor de empuje para el ejemplo de canal autenticado para obtener más información.
Similar a los canales privados, también puede suscribirse a un canal privado cifrado. Este complemento admite completamente el cifrado de extremo a extremo. Esto significa que solo usted y sus clientes conectados podrán leer sus mensajes. Pusher no puede descifrarlos. Estos canales deben estar prefijados con 'privado-cifrado-'
Al igual que con los canales privados, debe proporcionar un punto final de autenticación. Ese punto final debe estar utilizando un cliente de servidor que admita el cifrado de extremo a extremo. Hay un punto final de demostración para ver el uso de NodeJs.
Los canales de presencia son canales cuyos nombres están prefijados por 'Presence-' . Los canales de presencia también deben ser autenticados.
Channel presenceChannel = pusher. subscribe ( "presence-another-channel" );Hay dos tipos de eventos que ocurren en las suscripciones de canales.
Channel channel = pusher. subscribe ( "private-orders" );
channel. bind ( "order-status-updated" , ( PusherEvent event) {
print (event.data);
}); Las devoluciones de llamada que atan reciben un PusherEvent :
| Propiedad | Tipo | Descripción |
|---|---|---|
eventName | String | El nombre del evento. |
channelName | String | El nombre del canal en el que se activó el evento. (Opcional) |
data | String | Los datos que se pasaron a trigger , codificados como una cadena. Si pasó un objeto, entonces se habrá sido serializado a una cadena JSON que puede analizar según sea necesario. (Opcional) |
userId | String | La identificación del usuario que activó el evento. Esto solo está disponible para eventos del cliente activados en los canales de presencia. (Opcional) |
Puedes desgaste de un evento haciendo:
channel. unbind ( "order-status-updated" );Una vez que se ha autorizado una suscripción privada o de presencia y la suscripción ha tenido éxito, es posible activar eventos en esos canales.
Los eventos activados por los clientes se llaman eventos del cliente. Debido a que se están activando de un cliente en el que no se puede confiar, hay una serie de reglas forzadas al usarlas. Algunas de estas reglas incluyen:
channel. bind ( "pusher:subscription_succeeded" , ( PusherEvent event) {
channel. trigger ( "client-istyping" , { "name" : "Bob" });
});Para obtener detalles completos, consulte la documentación de eventos del cliente.
Una vez conectado, puede acceder a un identificador único para la conexión del cliente actual. Esto se conoce como el ID de socket . Puede acceder al valor una vez que la conexión se ha establecido de la siguiente manera:
String socketId = pusher. getSocketId ();Para obtener más información sobre cómo y por qué hay una identificación de socket, consulte la documentación sobre la autenticación de los usuarios y excluyendo a los destinatarios.
El registro de iOS no parece emitir una consola Flutter, sin embargo, si ejecuta la aplicación desde Xcode, debería poder ver los registros.
Si usa un servidor de empuje local pero no puede suscribirse a un canal privado, agregue esto a su iOS/Runner/Info.plist:
< key >NSAppTransportSecurity</ key >
< dict >
< key >NSAllowsArbitraryLoads</ key >
< true />
</ dict >Si sabe qué dominios se conectará a agregar:
< key >NSAppTransportSecurity</ key >
< dict >
< key >NSExceptionDomains</ key >
< dict >
< key >example.com</ key >
< dict >
< key >NSExceptionAllowsInsecureHTTPLoads</ key >
< true />
< key >NSIncludesSubdomains</ key >
< true />
</ dict >
</ dict >
</ dict >