webman/push
webman/push
ist ein kostenloses Server-Plugin für Push-Benachrichtigungen, das auf einem Abonnement-Modell basiert und mit pusher kompatibel ist. Es verfügt über zahlreiche Client-Bibliotheken wie JS, Android (Java), iOS (Swift), iOS (Obj-C), uniapp, .NET, Unity, Flutter, AngularJS usw. Das Backend-Push-SDK unterstützt PHP, Node, Ruby, Asp, Java, Python, Go, Swift usw. Der Client hat eine integrierte Herzschlagfunktion und automatisches Wiederverbinden, was die Nutzung sehr einfach und stabil macht. Es eignet sich für viele sofortige Kommunikationsszenarien wie Nachrichten-Push, Chats usw.
Im Plugin sind ein Web-Client push.js
sowie der uniapp-Client uniapp-push.js
enthalten. Clients in anderen Sprachen können von https://pusher.com/docs/channels/channels_libraries/libraries/ heruntergeladen werden.
Installation
composer require webman/push
Client (javascript)
JavaScript-Client einbinden
<script src="/plugin/webman/push/push.js"> </script>
Client-Nutzung (öffentlicher Kanal)
// Verbindung herstellen
var connection = new Push({
url: 'ws://127.0.0.1:3131', // Websocket-Adresse
app_key: '<app_key, in config/plugin/webman/push/app.php abrufen>',
auth: '/plugin/webman/push/auth' // Abonnement-Autorisierung (nur für private Kanäle)
});
// Angenommen, die Benutzer-UID ist 1
var uid = 1;
// Der Browser hört auf Nachrichten im Kanal user-1, also Nachrichten des Benutzers mit UID 1
var user_channel = connection.subscribe('user-' + uid);
// Wenn im Kanal user-1 eine Nachricht vom Ereignis message empfangen wird
user_channel.on('message', function(data) {
// data enthält den Nachrichteninhalt
console.log(data);
});
// Wenn im Kanal user-1 eine Nachricht vom Ereignis friendApply empfangen wird
user_channel.on('friendApply', function (data) {
// data enthält Informationen zur Freundschaftsanfrage
console.log(data);
});
// Angenommen, die Gruppen-ID ist 2
var group_id = 2;
// Der Browser hört auf Nachrichten im Kanal group-2, also auf Gruppen-Nachrichten der Gruppe 2
var group_channel = connection.subscribe('group-' + group_id);
// Wenn der Gruppe 2 eine Nachricht vom Ereignis message empfangen wird
group_channel.on('message', function(data) {
// data enthält den Nachrichteninhalt
console.log(data);
});
Tipps
Im obigen Beispiel wird die Methode subscribe verwendet, um einen Kanal zu abonnieren.message
undfriendApply
sind Ereignisse im Kanal. Kanal- und Ereignisnamen können beliebige Strings sein und müssen nicht zuvor vom Server konfiguriert werden.
Server-Push (PHP)
use Webman\Push\Api;
$api = new Api(
// In Webman kann die Konfiguration direkt mit config abgerufen werden, nicht-Webman-Umgebungen müssen die entsprechenden Konfigurationen manuell eingeben
'http://127.0.0.1:3232',
config('plugin.webman.push.app.app_key'),
config('plugin.webman.push.app.app_secret')
);
// Pushen einer Nachricht des Ereignisses message an alle Clients, die user-1 abonniert haben
$api->trigger('user-1', 'message', [
'from_uid' => 2,
'content' => 'Hallo, dies ist der Nachrichteninhalt'
]);
Private Kanäle
Im obigen Beispiel kann jeder Benutzer Informationen über Push.js abonnieren, was unsicher ist, wenn es sich um sensible Informationen handelt.
webman/push
unterstützt das Abonnieren privater Kanäle, die mit private-
beginnen. Zum Beispiel
var connection = new Push({
url: 'ws://127.0.0.1:3131', // Websocket-Adresse
app_key: '<app_key>',
auth: '/plugin/webman/push/auth' // Abonnement-Autorisierung (nur für private Kanäle)
});
// Angenommen, die Benutzer-UID ist 1
var uid = 1;
// Der Browser hört auf Nachrichten im privaten Kanal private-user-1
var user_channel = connection.subscribe('private-user-' + uid);
Wenn der Client einen privaten Kanal abonniert (Kanal, der mit private-
beginnt), wird eine Ajax-Autorisierungsanforderung gestartet (die Ajax-Adresse ist die, die im auth-Parameter beim Erstellen des neuen Push-Objekts konfiguriert wurde). Der Entwickler kann hier überprüfen, ob der aktuelle Benutzer berechtigt ist, diesen Kanal zu überwachen. Dies gewährleistet die Sicherheit des Abonnements.
Weitere Informationen zur Autorisierung finden Sie im Code in
config/plugin/webman/push/route.php
.
Client-Push
Im obigen Beispiel hat der Client einen Kanal abonniert, und der Server hat die API aufgerufen, um Nachrichten zu pushen. Webman/push unterstützt auch das direkte Pushen von Nachrichten vom Client.
Hinweis
Client-zu-Client-Push ist nur für private Kanäle (Kanal, der mitprivate-
beginnt) verfügbar, und der Client kann nur Ereignisse auslösen, die mitclient-
beginnen.
Beispiel für das Auslösen von Ereignispush durch den Client
var user_channel = connection.subscribe('private-user-1');
user_channel.on('client-message', function (data) {
//
});
user_channel.trigger('client-message', {form_uid:2, content:"Hallo"});
Hinweis
Der obige Code sendet Daten über das Ereignisclient-message
an alle Clients, dieprivate-user-1
abonniert haben (der pushende Client erhält seine eigenen gesendeten Daten nicht).
Webhooks
Webhooks dienen dazu, einige Ereignisse in einem Kanal zu empfangen.
Aktuell gibt es hauptsächlich 2 Ereignisse:
-
- channel_added
Ein Ereignis, das ausgelöst wird, wenn ein Kanal von einem Zustand, in dem keine Clients online sind, in einen Zustand wechselt, in dem Clients online sind, oder auch als Online-Ereignis bezeichnet wird.
- channel_added
-
- channel_removed
Ein Ereignis, das ausgelöst wird, wenn alle Clients eines Kanals offline sind, oder auch als Offline-Ereignis bezeichnet wird.
- channel_removed
Tipps
Diese Ereignisse sind sehr nützlich für die Verwaltung des Online-Status von Benutzern.Hinweis
Die Webhook-Adresse wird inconfig/plugin/webman/push/app.php
konfiguriert.
Für die Verarbeitung von Webhook-Ereignissen beziehen Sie sich auf die Logik inconfig/plugin/webman/push/route.php
.
Eine vorübergehende Offline-Statusänderung aufgrund eines Seitenaktualisierens sollte nicht als Offline betrachtet werden; Webman/push wird eine Verzögerungsprüfung durchführen, sodass die Online-/Offline-Ereignisse eine Verzögerung von 1-3 Sekunden haben können.
WSS-Proxy (SSL)
Unter https kann keine ws-Verbindung verwendet werden, stattdessen muss eine wss-Verbindung verwendet werden. In diesem Fall kann Nginx als WSS-Proxy eingesetzt werden, die Konfiguration sieht wie folgt aus:
server {
# .... Weitere Konfigurationen hier weggelassen ...
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;
}
}
Hinweis: Der oben genannte <app_key>
wird in config/plugin/webman/push/app.php
abgerufen.
Starten Sie Nginx neu und verwenden Sie dann die folgende Methode, um eine Verbindung zum Server herzustellen
var connection = new Push({
url: 'wss://example.com',
app_key: '<app_key, in config/plugin/webman/push/app.php abrufen>',
auth: '/plugin/webman/push/auth' // Abonnement-Autorisierung (nur für private Kanäle)
});
Hinweis
- Die Anforderungsadresse muss mit wss beginnen.
- Port muss nicht angegeben werden.
- Es muss eine Verbindung zu der Domain des SSL-Zertifikats hergestellt werden.
push-vue.js Gebrauchsanweisung
-
Kopieren Sie die Datei push-vue.js in das Projektverzeichnis, z. B.: src/utils/push-vue.js.
-
Binden Sie sie in der Vue-Seite ein.
## Andere Client-Adressen
`webman/push` ist mit Pusher kompatibel. Die Adressen für andere Sprachen (Java, Swift, .NET, Objective-C, Unity, Flutter, Android, iOS, AngularJS usw.) können hier heruntergeladen werden:
https://pusher.com/docs/channels/channels_libraries/libraries/