我使用推送器在我的网站上实现实时聊天和通知。允许用户与他人开始对话(聊天),对话只能是1对1。
消息也存储在db中,以便用户也可以拥有聊天记录。
我使用userId = 14的用户有三个活动对话我会在php中生成JS脚本,将他连接到推送器并订阅三个存在通道,代表三个对话中的每一个。每个频道都有像" new-msg"一切都很好 - 如果聊天窗口打开,用户会收到消息,如果没有,则会收到通知徽章。
当其他用户想要使用userId = 14开始新对话时,问题就开始了。没有私人或存在渠道。如果我使用公共频道,那么每个登录的用户都会得到通知,这是不好的。
我所知道的是,一旦登录我的网站,用户就会连接到推送器,另外还有已经活跃的在线频道,这些频道会在公共频道"新对话"但每个用户都在等待代表其userId的特定事件。
var pusher = new Pusher('APP_KEY');
var channel = pusher.subscribe('new-conversations');
channel.bind(userId,
function(data) {
// subscribes to new presence-channel using information from data variable
}
);
当另一个用户想要用userId = 14开始对话时,他对服务器进行ajax调用,其中PHP脚本生成表示userId = 14的事件,其中包含关于他自己的数据并将其发送给每个连接(登录)的用户,但只有userId = 14是等待这个。一旦触发,userId = 14就可以获得新的在线通道。
虽然所有这些情况都有效,但我想知道是否有更好,更清洁的开箱即用解决方案?我已阅读推文文档,但发现什么都没有,但我拒绝,除了那个推动开发者没有关于它。
可能的解决方案
我虽然有另一个解决方案。每个用户都应订阅在线频道var channel = pusher.subscribe('presence-14');
,其中14 = userId。如果userId = 39想要与他开始对话,则他将userId = 14发送到服务器,并且服务器将userId = 39发送到频道" presence-14"。是吗?