🐥

iOS 15 の "即時通知"を送りたいと言われた話

2022/03/08に公開

プロマネ夫から、「iOSのアプリの通知、"即時通知"にしたいんだけど」と言われた話。

即時通知ってなに?

iOS 15 からのしくみで、通知のバナーの左上に"即時通知"と表示される通知。その名の通り、リアルタイムな通知が必要な速報アプリとかナビアプリとかに使われている。英語では "Time Sensitive Notifications" がこれに該当するようだ。現時点ではまとまった情報がない。

具体的にどう指定したら"即時通知"で送信できるのか

結論

APNsへのJSON Payloadに、"interruption-level": "time-sensitive"
を指定すればいい。

Generating a Remote Notification - Apple Developer Documentation

Laravel での例

今回は通知の送信に Firebase Cloud Messaging (FCM) を使っている。
バックエンドは Laravel で作っていて、FCMの利用は kreait/laravel-firebase を使っている。これは kreait/firebase-php の Laravel 用パッケージなので詳しいドキュメントは firebase-php.readthedocs.io を見ればよい...のだが、即時通知の情報はまだ載っていない。

CloudMessage::fromArray()は配列の内容をそのまま変換してくれるようなのでこれを利用して↓のようにメッセージを作成して送信する。

$message_array = [
    'token' => $fcm_token,
    'notification' => $notification,
    'data' => $data,
    'apns' => [
        // ...
        'payload' => [
            'aps' => [
                'interruption-level' => 'time-sensitive', // 即時通知
                // ...
            ]
        ]
    ],
];

$message = CloudMessage::fromArray($message_array);
Firebase::messaging()->send($message);

iOS アプリ側での対応も必要

通知を受信する側のアプリでも即時通知に対応するための設定が必要。

Xcode で Capability に "Time Sensitive Notifications" を追加する。
Adding Capabilities to Your App - Apple Developer Documentation


即時通知っていきなり言われても。いや、夫からの依頼は大体そんな感じで来るのだけど。

Discussion