简介
webman/push 是一个推送插件,客户端基于订阅模式,兼容 pusher,拥有众多客户端如JS、安卓(java)、IOS(swift)、IOS(Obj-C)、uniapp。后端推送SDK支持PHP、Node、Ruby、Asp、Java、Python、Go等。使用起来非常简单稳定。适用于消息推送、聊天等诸多即时通讯场景。
插件需要webman>=1.2.0 webman-framework>=1.2.0
安装
composer require webman/push
客户端 (javascript)
引入javascript客户端
<script src="/plugin/webman/push/push.js"> </script>
客户端使用(公有频道)
// 建立连接var connection = new Push({url: 'ws://127.0.0.1:3131', // websocket地址app_key: '<app_key,在config/plugin/webman/push/app.php里获取>',auth: '/plugin/webman/push/auth' // 订阅鉴权(仅限于私有频道)});// 假设用户uid为1var uid = 1;// 浏览器监听user-1频道的消息,也就是用户uid为1的用户消息var user_channel = connection.subscribe('user-' + uid);// 当user-1频道有message事件的消息时user_channel.on('message', function(data) {// data里是消息内容console.log(data);});// 当user-1频道有friendApply事件时消息时user_channel.on('friendApply', function (data) {// data里是好友申请相关信息console.log(data);});// 假设群组id为2var group_id = 2;// 浏览器监听group-2频道的消息,也就是监听群组2的群消息var group_channel = connection.subscribe('group-' + group_id);// 当群组2有message消息事件时group_channel.on('message', function(data) {// data里是消息内容console.log(data);});
Tips 以上例子中subscribe实现频道订阅,
messagefriendApply是频道上的事件。频道和事件是任意字符串,不需要服务端预先配置。
服务端推送(PHP)
use Webman\Push\Api;$api = new Api(// webman下可以直接使用config获取配置,非webman环境需要手动写入相应配置'http://127.0.0.1:3232',config('plugin.webman.push.app.app_key'),config('plugin.webman.push.app.app_secret'));// 给订阅 user-1 的所有客户端推送 message 事件的消息$api->trigger('user-1', 'message', ['from_uid' => 2,'content' => '你好,这个是消息内容']);
私有频道
以上例子里任何用户都可以通过 Push.js 订阅信息,如果信息是敏感信息,这样是不安全的。
webman/push支持私有频道订阅,私有频道是以 private- 开头的频道。例如
var connection = new Push({url: 'ws://127.0.0.1:3131', // websocket地址app_key: '<app_key>',auth: '/plugin/webman/push/auth' // 订阅鉴权(仅限于私有频道)});// 假设用户uid为1var uid = 1;// 浏览器监听private-user-1私有频道的消息var user_channel = connection.subscribe('private-user-' + uid);
当客户端订阅私有频道时(private-开头的频道),浏览器会发起一个ajax鉴权请求(ajax地址为new Push时auth参数配置的地址),开发者可以在这里判断,当前用户是否有权限监听这个频道。这样就保证了订阅的安全性。
关于鉴权参见
config/plugin/webman/push/route.php中的代码
客户端推送
以上例子都是客户端订阅某个频道,服务端调用API接口推送。webman/push 也支持客户端直接推送消息。
注意 客户端间推送仅支持私有频道(
private-开头的频道),并且客户端只能触发以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:"hello"});
注意 以上代码给所有(除了当前客户端)订阅了
private-user-1的客户端推送client-message事件的数据(推送客户端不会收到自己推送的数据)。
webhooks
webhook用来接收频道的一些事件。
目前主要有2个事件:
1、channel_added 当某个频道从没有客户端在线到有客户端在线时触发的事件,或者说是在线事件
2、channel_removed 当某个频道的所有客户端都下线时触发的事件,或者说是离线事件
Tips 这些事件在维护用户在线状态非常有用。
注意 webhook地址在
config/plugin/webman/push/app.php中配置。 接收处理webhook事件的代码参考config/plugin/webman/push/route.php里面的逻辑 由于刷新页面导致用户短暂离线不应该算作离线,webman/push会做延迟判断,所以在线/离线事件会有1-3秒的延迟。
wss代理(SSL)
https下无法使用ws连接,需要使用wss连接。这种情况可以使用nginx代理wss,配置类似如下:
server {# .... 这里省略了其它配置 ...location /app{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;}}
重启nginx后,使用以下方式连接服务端
var connection = new Push({url: 'wss://example.com',app_key: '<app_key,在config/plugin/webman/push/app.php里获取>',auth: '/plugin/webman/push/auth' // 订阅鉴权(仅限于私有频道)});
注意
- wss开头
- 不写端口
- 必须使用ssl证书对应的域名连接
其他客户端地址
webman/push 兼容pusher,其他语言(Java Swift .NET Objective-C Unity Flutter Android IOS AngularJS等)客户端地址下载地址:
https://pusher.com/docs/channels/channels_libraries/libraries/
