【问题标题】:pusher client events triggering for user为用户触发的推送客户端事件
【发布时间】:2015-07-07 10:34:36
【问题描述】:

我目前正在开发一个实时应用程序,它允许用户将其他人添加到“团队”中,我想通知用户他们已被实时添加。但是我无法终生工作如何实现这一点,我认为文档最让我感到困惑,

用户必须订阅触发事件的频道

这怎么可能?当然是因为我正在尝试实时将一些人添加到一个组中,而该组是一个独特的频道,我也不能订阅它吗?

这是我的尝试,以及对过程的解释。

1) 用户登录到应用程序并订阅他们唯一的频道“presence-user_{id}”,其中 id 是来自数据库的用户 id。

2)其他地方的用户想要将用户添加到他们的组中,选择运行以下代码的用户,

App['presence-' + 'user_' + newUser.get('id')] = App.pusher.subscribe('presence-user_' + newUser.get('id'));
                            App['presence-' + 'user_' + newUser.get('id')].trigger('client-user-added', { project : self.model.get('id') });

newUser 是一个主干模型,详细说明了所选用户的用户详细信息。我在这里要做的是将尝试将用户加入群组的用户订阅到该用户频道。

这应该会触发这个方法监听器,

App['presence-' + 'user_' + App.Session.get('user_id')].bind('client-user-added', this.RT_addProject, this);

这反过来应该在添加的客户端应用程序上触发以下方法,

RT_addProject: function(data) {
    console.log(data);
},

但事实并非如此。触发客户端事件的正确方法是什么?

TLDR;我想在使用推送器将用户添加到组时实时通知用户。

【问题讨论】:

    标签: javascript backbone.js real-time pusher


    【解决方案1】:

    presence channels的关键点是:

    1. 状态频道名称应在您希望加入群组的用户之间共享 - 订阅频道的行为会将他们添加到频道中。
    2. 频道上的每个用户都需要一个您通过服务器提供的唯一 ID(可能是用户会话 ID),通过 auth callback。这可以在频道上唯一标识他们。
    3. 如果身份验证成功,他们就会被订阅。订阅后,客户端通过pusher:subscription_succeeded 事件获取频道上现有用户的初始列表。
    4. 通过pusher:member_added 事件通知频道的现有订阅者存在新用户。
    5. 当用户离线(关闭浏览器、在页面之间导航或通过代码取消订阅)时,频道上的所有其他用户都会通过pusher:member_removed 事件通知该用户已离开频道。

    例如。在客户端:

    var pusher = new Pusher(APP_KEY);
    var chatChannel = pusher.subscribe('presence-chat');
    
    chatChannel.bind('pusher:subscription_succeeded', function(members) {
      members.each(memberAdded);
    });
    chatChannel.bind('pusher:member_added', memberAdded);
    chatChannel.bind('pusher:member_removed', memberRemoved);
    
    function memberAdded(member) {
      // add to UI etc.
    }
    
    function memberRemoved(member) {
      // remove from UI etc.
    }
    

    订阅行为会导致 Pusher JS 库向服务器端点发送 auth POST request

    服务器伪代码:

    var channelName = authRequest.postParam['channel-name'];
    var socketId =  authRequest.postParam['socket-id'];
    
    var pusher = new Pusher(YOUR_CREDENTIALS);
    
    if( currentSessionUserAllowedToSubscribeToChannel(channelName)  ) {
      var uniqueUserId = getCurrentSessionUserUniqueId();
      var customUserInfo = getCustomUserInfo();
      var authSignature = pusher.presence_auth(channelName,
                                          uniqueUserId,
                                          customUserInfo);
    
      send200AuthJSONToClient(authSignature);
    }
    else {
      send401ToClient();
    }
    

    触发客户端事件的正确方法是什么?

    一旦订阅成功,客户端事件只能在私人或在线频道上触发:

    var pusher = new Pusher(APP_KEY);
    var chatChannel = pusher.subscribe('presence-chat');
    
    chatChannel.bind('pusher:subscription_succeeded', function() {
      var wasTriggered = pusher.trigger('client-event', {some: 'data'});
      console.log(wasTriggered);
    });
    

    TLDR;我想在使用推送器将用户添加到组时实时通知用户。

    如果用户 A 想要用户 B 加入频道 X,那么您需要向用户 B 发出有关频道 X 存在的信号,以便他们可以订阅它。

    userB 只能在他们订阅的频道上接收事件。因此,userA 需要在 userB 知道的频道上发送事件。一个常见的解决方案是拥有一个每个用户的频道,例如userA-notifications 和 userA 需要在这个频道上触发一个事件通过服务器。最终,您需要授权来阻止触发不需要的事件。

    此答案与上述过程相关:https://stackoverflow.com/a/28165893/39904

    【讨论】:

    • 谢谢你,这有点帮助,但我不确定我在最初的问题中是否 100% 清楚。一个用户是团队的成员,另一个用户不知道团队存在 - 团队名称也是频道名称,我如何将用户添加到他们基本上不存在的频道?
    • 我添加了关于触发客户端事件的说明,并添加了一些关于通知用户的信息。
    • 腰带!非常感谢。
    猜你喜欢
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    相关资源
    最近更新 更多