Laravel 安排推送通知并在必要时取消它

Posted

技术标签:

【中文标题】Laravel 安排推送通知并在必要时取消它【英文标题】:Laravel schedule push notification and cancel it if necessary 【发布时间】:2020-10-18 14:24:04 【问题描述】:

在我的带有 Laravel 的应用中,后端用户可以互相发送消息。

我想在新收件箱消息上向应用用户发送推送通知,但我需要仅在用户尚未阅读此消息时发送消息。

所以我是这么看的

    每发送一条消息,我都需要在 1 分钟后安排 Laravel 通知 如果用户已经收到此消息,我需要取消此通知

如何在 Laravel 中关闭预定通知? this approach 现在还好吗?

类扩展通知

public function via($notifiable)

    if($this->dontSend($notifiable)) 
        return [];
    
    return ['mail'];


public function dontSend($notifiable)

    return $this->appointment->status === 'cancelled';
 

也许有更方便的方法来处理它?例如,每次都发送推送,但如果它已经启动,则以某种方式将其从应用中显示出来?

【问题讨论】:

如何知道用户是否收到通知?你会跟踪它吗? 如果应用启用了推送通知,我可以在应用内跟踪它们并在需要时向服务器发出一些 API 请求 【参考方案1】:

一种方法是这样的;

在触发通知之前,请使用user_id 的组合创建一个唯一标识符(sha1 可能是一个选项)。假设它是SgiA7EfBQBFQK3pjRWtaxB1CkSf7gf4lSixvei3jU3ydHJ39ZGjhhdUUCnHRno3C。将其发送到通知。通知和消息将同时发送,但通知会延迟一分钟。
$identifier = Str::random(64);
$delay = now()->addMinute();
$user->notify((new MyNotification($identifier))->delay($delay));
// send a request that contains identifier.
您将此设置为 TTL 为 2 分钟的 Redis。如果不采取行动,它就会消失。
Redis::set('SgiA7EfBQBFQK3pjRWtaxB1CkSf7gf4lSixvei3jU3ydHJ39ZGjhhdUUCnHRno3C', 1, 120);
向用户发送消息时,将此标识符附加到消息中。当用户阅读该消息时,您会使用所有参数 + 标识符向您的 /read 端点发出请求。 收到请求后,从 Redis 中删除密钥。 (用户收到消息)
Redis::del('SgiA7EfBQBFQK3pjRWtaxB1CkSf7gf4lSixvei3jU3ydHJ39ZGjhhdUUCnHRno3C');
在 Notification 类中,实现一个小方法来检查键是否存在于 Redis 中。
Redis::exists('SgiA7EfBQBFQK3pjRWtaxB1CkSf7gf4lSixvei3jU3ydHJ39ZGjhhdUUCnHRno3C');
class MyNotification extends BaseNotification

    use Queueable;

    private $identifier;

    public function __construct($identifier)
    
        $this->identifier = $identifier;
    

    public function via()
    
        return $this->isValid() ? ['mail'] : [];
    

    public function isValid()
    
        return Redis::exists($this->identifier);
    

    public function toMail()
    
        // details..
    

它不一定是 Redis,但它是这种键/值结构的完美匹配。

【讨论】:

这种情况下需要2分钟后触发通知吗? 其实发送消息的时候会触发。将延迟 1 分钟的延迟通知

以上是关于Laravel 安排推送通知并在必要时取消它的主要内容,如果未能解决你的问题,请参考以下文章

停止计划的推送通知在反应本机推送通知中

用户在屏幕聊天时如何取消本地推送通知?

打包 iOS 应用后推送通知停止工作

Laravel Echo 没有收到推送者的通知

当应用程序在后台时,推送通知未调用 didReceiveRemoteNotification

Firebase 云功能不发送异步推送通知