0Pricing
Swift Academy · レッスン

通知ペイロードの処理

フォアグラウンドとバックグラウンドの通知に対応します。

「通知ペイロードの処理」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

ペイロードの構造

リモート通知は、サーバーがAPNsに送信するJSON辞書です。予約済みのapsキーには、アラート、サウンド、バッジなど、ユーザーに表示されるコンテンツが格納されます。それ以外のキーには、開く項目のIDなど、任意のカスタムデータを格納します。

// Example payload JSON:
// {
//   "aps": { "alert": { "title": "Hi", "body": "..." },
//            "sound": "default", "badge": 1 },
//   "itemId": "42"
// }

aps辞書

aps内では、alertに文字列を指定することも、タイトル、本文、サブタイトルを含むオブジェクトを指定することもできます。sound、badge、content-availableやmutable-contentなどのフラグもここに格納します。apsの外側は、すべて自由に定義できます。

// aps keys:
//   alert: { title, subtitle, body }
//   sound: "default" or critical sound object
//   badge: Int
//   content-available: 1  (silent / background)
//   mutable-content: 1    (allow modification)

フォアグラウンドでの通知配信

デフォルトでは、アプリがフォアグラウンドにあるときに届いた通知は表示されません。表示するには、デリゲートのwillPresentを実装し、バナーやサウンドなど、表示したいプレゼンテーションオプションを返します。

import UserNotifications
func userNotificationCenter(
    _ center: UNUserNotificationCenter,
    willPresent notification: UNNotification
) async -> UNNotificationPresentationOptions {
    return [.banner, .sound, .badge]
}

タップへの応答

ユーザーが通知をタップすると(アプリがバックグラウンドにある場合や終了している場合も含めて)、デリゲートのdidReceive responseが実行されます。ここでペイロードを読み取り、適切な画面に遷移します。

import UserNotifications
func userNotificationCenter(
    _ center: UNUserNotificationCenter,
    didReceive response: UNNotificationResponse
) async {
    let info = response.notification.request
        .content.userInfo
    if let id = info["itemId"] as? String {
        print("open item", id)
    }
}

userInfoの読み取り

カスタムキーを含む完全なペイロードは、[AnyHashable: Any]辞書であるcontent.userInfoとして取得できます。各値は慎重にキャストしてください。形式が不正なペイロードによってアプリがクラッシュしないよう、強制アンラップは決して行わないでください。

import UserNotifications
func route(_ userInfo: [AnyHashable: Any]) {
    guard let screen = userInfo["screen"] as? String
    else { return }
    switch screen {
    case "profile": print("go to profile")
    case "cart":    print("go to cart")
    default:        break
    }
}

サイレント(バックグラウンド)通知

content-available: 1を設定し、アラートを省略すると、サイレントプッシュになります。これはUIを表示せずにアプリをバックグラウンドで起動し、データを取得できるようにします。サイレントプッシュはシステムによって制限され、Remote notificationsのバックグラウンドモードが必要です。

// Silent payload — no alert, just a wake-up:
// { "aps": { "content-available": 1 }, "sync": true }
let silent = "content-available wakes app quietly"
_ = silent

バックグラウンド取得ハンドラー

サイレントプッシュは、アプリデリゲートのdidReceiveRemoteNotification非同期メソッドに届きます。そこでデータを取得し、UIBackgroundFetchResultを返します。これにより、システムは新しいデータが届いたかどうかを把握し、今後の起動に割り当てるリソースを調整できます。

import UIKit
func application(
    _ app: UIApplication,
    didReceiveRemoteNotification userInfo: [AnyHashable: Any]
) async -> UIBackgroundFetchResult {
    // fetch fresh data here
    return .newData
}

可変コンテンツとサービス拡張

mutable-content: 1を設定すると、Notification Service Extensionが表示前のプッシュを受け取り、本文の復号、画像添付ファイルのダウンロード、タイトルの書き換えなどを行えます。拡張機能が処理を完了するまでの時間には短い制限があります。

// Service extension entry point (UNNotificationServiceExtension):
// override didReceive(_:withContentHandler:)
//   modify bestAttemptContent, then call contentHandler
let mutable = "mutable-content enables interception"
_ = mutable

アラートのローカライズ

サーバー側でテキストをローカライズするには、アプリのLocalizable文字列にあるキーを参照するtitle-loc-keyとloc-keyに加え、置換用のloc-argsを送信します。デバイスがユーザーの言語で表示するため、あらかじめ翻訳したテキストを送信する必要はありません。

// Localized alert payload:
// "alert": {
//   "loc-key": "NEW_MESSAGE",
//   "loc-args": ["Ada"]
// }
let localized = "loc-key resolves on device"
_ = localized

バッジの更新

badgeの値で、アプリアイコンに表示する数字を設定します。badge: 0を送信すると、数字が消去されます。ユーザーがコンテンツを読んだ後にsetBadgeCountを使ってコードから設定することもでき、未読状態とバッジを同期できます。

import UserNotifications
func clearBadge() async {
    try? await UNUserNotificationCenter.current()
        .setBadgeCount(0)
}

堅牢なハンドラー

各要素を組み合わせます。フォアグラウンドでは通知を表示し、タップされたら適切な処理に振り分け、すべてのキャストを検証します。ハンドラーは予期しないペイロードでもクラッシュせず、取得できる情報を常に取り出します。

import UserNotifications
func handleTap(_ response: UNNotificationResponse) {
    let info = response.notification.request
        .content.userInfo
    guard let id = info["itemId"] as? String else {
        print("no item id; open home")
        return
    }
    print("navigate to item", id)
}

クイックチェック

通知がタップされたときの対応方法を思い出してください。

まとめ

ペイロードの処理方法を学びました:

  • aps辞書にはユーザーに表示されるコンテンツが格納され、それ以外のキーにはアプリのデータが格納されます。データはuserInfoから読み取ります。
  • willPresentをオーバーライドしてフォアグラウンドの通知を表示し、didReceive responseでタップを処理します。
  • content-available: 1によってサイレントなバックグラウンド取得が実行され、UIBackgroundFetchResultを返します。
  • mutable-contentによってサービス拡張を利用でき、loc-keyによってデバイス上でテキストをローカライズできます。

よくある質問

「通知ペイロードの処理」レッスンは無料ですか?

はい。「通知ペイロードの処理」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「通知ペイロードの処理」で何を学びますか?

フォアグラウンドとバックグラウンドの通知に対応します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「通知ペイロードの処理」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. プッシュ通知への登録
  2. 通知ペイロードの処理
  3. バックグラウンドタスクと更新
  4. 通知のアクションとカテゴリ
← Swift Academyに戻る