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 e friendApply 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 con private-) e il client può attivare solo eventi che iniziano con client-.

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'evento client-message a tutti i client abbonati a private-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:

    1. 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.
    1. channel_removed
      Quando tutti i client di un canale sono offline, questo evento viene attivato, o si può dire che è un evento offline.

Suggerimenti
Questi eventi sono molto utili per mantenere lo stato online degli utenti.

Attenzione
L'URL del webhook è configurato in config/plugin/webman/push/app.php.
Il codice per gestire gli eventi webhook fa riferimento alla logica all'interno di config/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

  1. L'indirizzo della richiesta deve iniziare con wss
  2. Non scrivere la porta
  3. È necessario connettersi utilizzando il nome di dominio corrispondente al certificato ssl

Istruzioni per l'uso di push-vue.js

  1. Copiare il file push-vue.js nella directory del progetto, ad esempio: src/utils/push-vue.js

  2. 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/