如何使用 OneSignal 的 laravel 通知渠道订阅用户

How to subscribe user with laravel notification channel for OneSignal

我正在尝试使用 laravel-notifications-channel/onesignal and I am having some problems with users in my laravel app set up to receive notifications. The documentation on the github page 并未真正涵盖用户如何验证自己以接收通知。

即使阅读 OneSignal docs 将用户发送到 OneSignal 也不适合我。

如何设置它,当用户使用我们的网络应用程序时,他们会收到通知,然后我可以使用 laravel notifications 向他们发送通知?

这是我的 AssignedToTask 通知文件:

<?php

namespace App\Notifications;

use App\Task;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use NotificationChannels\OneSignal\OneSignalChannel;
use NotificationChannels\OneSignal\OneSignalMessage;
use NotificationChannels\OneSignal\OneSignalWebButton;

class AssignedToTask extends Notification
{

    use Queueable;

    protected $task;

    /**
     * Create a new notification instance.
     *
     * @return void
     */
    public function __construct(Task $task)
    {
        //
        $this->task = $task;
    }

    /**
     * Get the notification's delivery channels.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function via($notifiable)
    {
        return ['mail', OneSignalChannel::class];
    }

    public function toOneSignal($notifiable)
    {
        return OneSignalMessage::create()
            ->subject("Your {$notifiable->service} account was approved!")
            ->body("Click here to see details.")
            ->url('http://onesignal.com')
            ->webButton(
                OneSignalWebButton::create('link-1')
                    ->text('Click here')
                    ->icon('https://upload.wikimedia.org/wikipedia/commons/4/4f/Laravel_logo.png')
                    ->url('http://laravel.com')
            );
    }

    /**
     * Get the mail representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return \Illuminate\Notifications\Messages\MailMessage
     */
    public function toMail($notifiable)
    {
        return (new MailMessage)
                    ->subject('You have been assigned a new task')
                    ->line('You have a new task:  ' . $this->task->title)
                    ->action('View Task', url('tasks/' . $this->task->id));
    }

    /**
     * Get the array representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function toArray($notifiable)
    {
        return [
            //
        ];
    }
}

在我的用户模型中:

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Zizaco\Entrust\Traits\EntrustUserTrait;
use HipsterJazzbo\Landlord\BelongsToTenants;
use Cmgmyr\Messenger\Traits\Messagable;

class User extends Authenticatable
{
    use Notifiable;
    use EntrustUserTrait;
    use BelongsToTenants;
    use Messagable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password', 'company_id'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token', 'company_id'
    ];

    ....

    public function routeNotificationForOneSignal()
    {
        return 'ONE_SIGNAL_PLAYER_ID';
    }

    public function routeNotificationForMail()
    {
        return $this->email_address;
    }

}

如何在用户模型中设置和获取 ONE_SIGNAL_PLAYER_ID 以便用户接受通知并且我可以向他们发送通知?

编辑 - 2 由于您不知道发生了什么,让我试着解释一下如何使用 OneSignal

这是一个推送消息系统,就像任何其他推送通知系统一样。 (FCM(google),PubNub)。

工作原理

  1. 首先转到 OneSignal.Com 创建您的帐户,然后为您创建一个应用程序。一旦您创建了一个应用程序,它就会为您提供 SDK for Mobile,您的消费者所在的位置。
  2. 现在,每当您的消费者安装并启动您的应用程序时,他们都会使用自己的唯一 ID 和用户信息通知您的网络服务器。
  3. 您收到的有关该用户的信息是唯一的player_id,您将根据该用户将其存储在您的数据库中。
  4. 现在,当您想要向任何移动应用程序发送通知时,只需使用 player_id 调用 API Post 通知方法,OneSignal 将向那个移动应用程序。

编辑 - 1

我想现在我明白了你对 OneSignalChannel

通知的困惑

流量

  1. 您已经在您的应用程序数据库中针对每个用户存储了 players_ids。
  2. 现在,当您想向玩家推送通知时,只需从数据库中获取该用户 player_id,然后向 OneSignal 推送通知。

好吧,你从字面上理解了这个意思。导致问题的原因

public function routeNotificationForOneSignal()
{
    return 'ONE_SIGNAL_PLAYER_ID';
}

根据错误消息,该函数应该有一个 return 唯一 ID (UUID)。

将 return 值更改为 OneSignalChannel

处的实际玩家 ID

这就是我的朋友。