仅Chrome浏览器接收Pusher通知。使用Laravel 5.4和JQuery。

19
我正在使用Pusher API在Laravel 5.4中通过JQuery发送通知。我发现,无论是从Firefox还是Safari发送通知...都能成功到达Chrome浏览器,但反之则不行。另一个问题是,当我发送消息时,我自己也会收到它!尽管我使用了 toOthers() 方法。
下面是我的代码。如果您需要更多信息,请告诉我。
控制器代码
broadcast(new SendMessageEvent("hi", \Auth::user()))->toOthers();

刀片

$(function() {
    Pusher.logToConsole = true;
    var pusher = new Pusher('Pusher API key', {
        authEndpoint: 'broadcasting/auth',
        auth: {headers: {'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')}}
    });
    var channel = pusher.subscribe('private-user-channel.{!! \Auth::user()->UserID !!}');
    channel.bind('App\\Events\\SendMessageEvent', function(data) {
        console.log(data);
    });
});

事件

class SendMessageEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $msg;
    public $user;
    public $userid;

    public function __construct($msg, $user) {
        $this->msg = $msg;
        $this->user = $user;
        $this->userid = $this->user->UserID;
    }

    public function broadcastOn()
    {
        return new PrivateChannel('user-channel.1');
    }
}

频道

Broadcast::channel('user-channel.{userid}', function ($user, $userid) {
    return (int) $user->UserID === (int) $userid;
});

3
根据文档:“在 Laravel 5.3 中,您无法在控制器构造函数中访问会话(session)或经过身份验证的用户(authenticated user),因为中间件(middleware)尚未运行。” 更多信息请参考:https://laravel.com/docs/5.3/upgrade#upgrade-5.3.0 - Martin Bean
2
我认为在你的 SendMessageEvent 类中的 broadcastOn 方法,你需要像这样进行更改:return new PrivateChannel('user-channel.'.$this->userid); - elegisandi
问题还未解决吗? - cre8
我也是。我可以从Firefox向Chrome发送通知(Chrome捕获推送通知),但不能从Chrome向Firefox发送(无法捕获)。 - Goper Leo Zosa
我可以问一下,为什么你要通过控制器发送通知吗? - phpdroid
3个回答

1

你应该使用 Laravel Echo,它比原始的 Pusher 更好,并且可以与 Laravel 推送通知一起使用私有频道。

    Echo.private('{{'App.User.'.Auth::id()}}')
                    .listen('.notify', (e) => {
                        ...
                    })                  
                .notification((notification) => {
                    ...
                });

1

我在搜索时找到了这个,如果问题仍然存在:

你的事件向userID 1广播所有内容

 return new PrivateChannel('user-channel.1');

但是你的其他用户会使用自己的userID连接到自己的频道。将其更改为公共频道,然后使用您的代码再次进行测试,其余部分似乎是正确的。


1
我不确定其他浏览器,但我知道toOthers()问题(针对VueJs)。
如果你正在使用Vue和Axios,socket ID将自动附加到每个发出的请求作为X-Socket-ID头。然后,当你调用toOthers方法仅限其他人时,
如果你想手动设置X-Socket-ID设置请求头

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接