webman/push
webman/push
è un plugin server di push gratuito, con un client basato su un modello di abbonamento, compatibile con pusher e dotato di numerosi client come JS, Android (java), iOS (swift), iOS (Obj-C), uniapp, .NET, Unity, Flutter, AngularJS, ecc. Il SDK di push per il backend supporta PHP, Node, Ruby, Asp, Java, Python, Go, Swift, ecc. Il client include heartbeat e riconnessione automatica, rendendolo molto semplice e stabile da utilizzare. È adatto per scenari di comunicazione istantanea come messaggi push, chat, ecc.
Il plugin include un client JS per il web push.js
e un client uniapp uniapp-push.js
. I client in altre lingue possono essere scaricati su https://pusher.com/docs/channels/channels_libraries/libraries/.
Installazione
composer require webman/push
Client (javascript)
Includere il client javascript
<script src="/plugin/webman/push/push.js"> </script>
Utilizzo del client (canale pubblico)
// Stabilire connessione
var connection = new Push({
url: 'ws://127.0.0.1:3131', // indirizzo websocket
app_key: '<app_key, ottenere da config/plugin/webman/push/app.php>',
auth: '/plugin/webman/push/auth' // autenticazione per abbonamento (solo per canali privati)
});
// Supponiamo che l'uid dell'utente sia 1
var uid = 1;
// Il browser ascolta i messaggi sul canale user-1, cioè i messaggi dell'utente con uid 1
var user_channel = connection.subscribe('user-' + uid);
// Quando ci sono messaggi con evento message nel canale user-1
user_channel.on('message', function(data) {
// data contiene il contenuto del messaggio
console.log(data);
});
// Quando ci sono messaggi con evento friendApply nel canale user-1
user_channel.on('friendApply', function (data) {
// data contiene le informazioni relative alla richiesta di amicizia
console.log(data);
});
// Supponiamo che l'ID del gruppo sia 2
var group_id = 2;
// Il browser ascolta i messaggi sul canale group-2, cioè ascolta i messaggi del gruppo 2
var group_channel = connection.subscribe('group-' + group_id);
// Quando ci sono messaggi di evento message nel gruppo 2
group_channel.on('message', function(data) {
// data contiene il contenuto del messaggio
console.log(data);
});
Suggerimenti
Nell'esempio sopra,subscribe
implementa l'abbonamento al canale,message
efriendApply
sono eventi sul canale. I canali e gli eventi possono essere stringhe arbitrarie e non è necessario configurare preventivamente il server.
Push server (PHP)
use Webman\Push\Api;
$api = new Api(
// in webman, è possibile utilizzare direttamente config per ottenere le configurazioni; in ambiente non webman, è necessario scrivere manualmente le configurazioni necessarie
'http://127.0.0.1:3232',
config('plugin.webman.push.app.app_key'),
config('plugin.webman.push.app.app_secret')
);
// Invia un messaggio evento message a tutti i client abbonati a user-1
$api->trigger('user-1', 'message', [
'from_uid' => 2,
'content' => 'Ciao, questo è il contenuto del messaggio'
]);
Canali privati
Nell'esempio sopra, qualsiasi utente può abbonarsi a informazioni tramite Push.js; se le informazioni sono sensibili, questo non è sicuro.
webman/push
supporta l'abbonamento a canali privati, che iniziano con private-
. Ad esempio:
var connection = new Push({
url: 'ws://127.0.0.1:3131', // indirizzo websocket
app_key: '<app_key>',
auth: '/plugin/webman/push/auth' // autenticazione per abbonamento (solo per canali privati)
});
// Supponiamo che l'uid dell'utente sia 1
var uid = 1;
// Il browser ascolta i messaggi sul canale privato private-user-1
var user_channel = connection.subscribe('private-user-' + uid);
Quando il client si abbona a un canale privato (canali che iniziano con private-
), il browser effettua una richiesta ajax di autenticazione (l'URL ajax è l'URL configurato nel parametro auth quando si crea un nuovo Push). Gli sviluppatori possono determinare qui se l'utente corrente ha il permesso di ascoltare questo canale. Questo garantisce la sicurezza dell'abbonamento.
Per informazioni sull'autenticazione, vedere il codice in
config/plugin/webman/push/route.php
.
Push dal client
Gli esempi sopra mostrano come il client si iscrive a un determinato canale e il server chiama l'API per inviare push. webman/push supporta anche l'invio diretto di messaggi dal client.
Attenzione
L'invio di messaggi tra client è supportato solo per canali privati (canali che iniziano conprivate-
) e il client può attivare solo eventi che iniziano conclient-
.
Esempio di attivazione dell'invio di eventi dal client
var user_channel = connection.subscribe('private-user-1');
user_channel.on('client-message', function (data) {
//
});
user_channel.trigger('client-message', {from_uid:2, content:"hello"});
Attenzione
Il codice sopra invia i dati dell'eventoclient-message
a tutti i client abbonati aprivate-user-1
(tranne il client corrente, che non riceverà i dati che ha inviato).
Webhooks
I webhook vengono utilizzati per ricevere alcuni eventi dai canali.
Attualmente ci sono principalmente 2 eventi:
-
- channel_added
Quando un canale passa dallo stato di nessun client online a uno stato in cui ci sono client online, questo evento viene attivato, o si può dire che è un evento online.
- channel_added
-
- channel_removed
Quando tutti i client di un canale sono offline, questo evento viene attivato, o si può dire che è un evento offline.
- channel_removed
Suggerimenti
Questi eventi sono molto utili per mantenere lo stato online degli utenti.Attenzione
L'URL del webhook è configurato inconfig/plugin/webman/push/app.php
.
Il codice per gestire gli eventi webhook fa riferimento alla logica all'interno diconfig/plugin/webman/push/route.php
.
Un breve periodo di disconnessione dell'utente a causa del refresh della pagina non dovrebbe essere considerato come disconnessione; webman/push effettua una valutazione ritardata, quindi gli eventi online/offline possono avere un ritardo di 1-3 secondi.
Proxy wss (SSL)
Non è possibile utilizzare la connessione ws sotto https, è necessario utilizzare la connessione wss. In questo caso, è possibile utilizzare nginx per proxyare wss, con una configurazione simile alla seguente:
server {
# .... Altre configurazioni omesse ...
location /app/<app_key>
{
proxy_pass http://127.0.0.1:3131;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
}
}
Attenzione: <app_key>
nella configurazione sopra può essere ottenuto in config/plugin/webman/push/app.php
Dopo aver riavviato nginx, utilizzare il seguente metodo per connettersi al server
var connection = new Push({
url: 'wss://example.com',
app_key: '<app_key, ottenere da config/plugin/webman/push/app.php>',
auth: '/plugin/webman/push/auth' // autenticazione per abbonamento (solo per canali privati)
});
Attenzione
- L'indirizzo della richiesta deve iniziare con wss
- Non scrivere la porta
- È necessario connettersi utilizzando il nome di dominio corrispondente al certificato ssl
Istruzioni per l'uso di push-vue.js
-
Copiare il file push-vue.js nella directory del progetto, ad esempio: src/utils/push-vue.js
-
Importare nella pagina vue
## Altri indirizzi client
`webman/push` è compatibile con pusher, gli indirizzi per scaricare i client in altre lingue (Java, Swift, .NET, Objective-C, Unity, Flutter, Android, iOS, AngularJS, ecc.) sono disponibili al link:
https://pusher.com/docs/channels/channels_libraries/libraries/