Search code examples
phpioslaravelapple-push-notifications

laravel-notification-channels/apn either isn't sending notification or my iPhone isn't receiving the notification


I am using this package to try and send apn notifications in my Laravel app. However, I have followed the documentation on the main page, and when I try to send an apn notification, I can log on the server that the constructor and via methods are called, but I can't figure out why my notification either isn't being sent or isn't being received. My logs have no info from the package either.

How do I troubleshoot this? What am I missing?

MyNotification.php

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Support\Facades\Log;
use NotificationChannels\Apn\ApnChannel;
use NotificationChannels\Apn\ApnMessage;

class MyNotification extends Notification
{
    use Queueable;

    public function __construct()
    {
        Log::debug('MyNotification constructor called');
    }

    public function via($notifiable)
    {
        Log::debug('MyNotification via called');
        return [ApnChannel::class];
    }

    public function toApn($notifiable)
    {
        Log::debug('MyNotification toApn called');
        return ApnMessage::create()
            ->badge(1)
            ->title('My title')
            ->body('My body');
    }

    public function routeNotificationForApn($notifiable)
    {
        Log::debug('MyNotification routeNotificationForApn called');
        return $notifiable->token;
    }
}

usage code in MyController.php

    public function sendNotification(MyModel $model)
    {
    // authorization checks here...

        $devices = Device::where('user_id', $model->user_id)->get();
        Notification::send($devices, new MyNotification());

        return response()->json(null, 200);
    }

Here is what my broadcasting.php and .env files look like: enter image description here enter image description here


Solution

  • The problem was that the function routeNotificationForApn() belongs in the notifiable model (in my instance, Device), not in the MyNotification class.

    Removing the use Queueable; is required as well if you don't have a queue set up.