Notification Content Extension — その概要とiOS向けカスタムインターフェースの作成方法

著者: IT Sectr 公開日: 2026-03-21 読了時間: 8 分

Notification Content Extensionは、標準のプッシュ通知インターフェースをカスタムUIViewに置き換えることができるiOS拡張機能です。デベロッパーはコンテンツ表示を完全に制御できます:画像、動画、アニメーション、カスタムフォント、インタラクティブ要素など。Apple Developer、2025によると、Notification Content Extensionは通知の限られたスペース内で任意のUIKitインターフェースをサポートします。

重要ポイント

  • Notification Content Extension — カスタムプッシュ通知UIのためのiOS拡張機能。
  • 拡張機能は必須メソッドdidReceiveを持つUNNotificationContentExtensionプロトコルを実装します。
  • カスタムインターフェースはStoryboardで作成され、任意のUIKitコンポーネントを含めることができます。
  • 拡張機能の最大サイズは50 MBで、圧縮状態では12 MBを超えてはいけません。
  • 拡張機能は指定されたcategoryIdentifierを持つ通知に対してアクティブになります。

Notification Content Extensionとは

Notification Content Extensionは、プッシュ通知の標準表示テンプレートをカスタムUIViewに置き換えるiOSのアプリ拡張機能です。コンテンツがタイトル、サブタイトル、本文に制限される通常の通知とは異なり、拡張機能は座標付きの地図、グラフ、画像ギャラリー、入力フォームなど、任意のUIKitインターフェースを表示できます。

仕組み

iOSが指定されたcategoryIdentifierを持つプッシュ通知を受信すると、システムはこのカテゴリに拡張機能が登録されているかどうかを確認します。登録されていれば、システムは別のプロセスで拡張機能を起動し、通知コンテンツを渡します。拡張機能は標準の代わりに独自のインターフェースを表示します。ユーザーはメインアプリケーションを開かずにカスタムインターフェースと対話します。

Notification Service Extensionとの違い

Notification Content ExtensionとNotification Service Extensionを混同しないことが重要です。Service Extensionは通知表示前にコンテンツを処理します(添付ファイルのダウンロード、復号化)。Content Extensionは準備完了したコンテンツを受け取った後にインターフェースを置き換えます。両方の拡張機能は連携して動作できます:Service Extensionがデータを準備し、Content Extensionがそれを表示します。

特性Content ExtensionService Extension
目的カスタム通知UI表示前のコンテンツ変更
実行時間ユーザーが通知を見ている間バックグラウンドで最大30秒
インターフェース完全なUIKit UIViewインターフェースなし
APIUNNotificationContentExtensionUNNotificationServiceExtension

拡張機能の制限

Notification Content Extensionは、リソースが制限された隔離されたプロセスで動作します。拡張機能はApp Groupを除き、NSUserDefaultsを介してメインアプリケーションのストレージにアクセスできません。拡張機能のサイズは展開状態で50 MBに制限されています。コンテンツ表示の時間も制限されており、拡張機能が妥当な時間内に更新を完了しない場合、システムはそれを強制終了します。

XcodeでNotification Content Extensionを作成する

Xcodeで拡張機能を作成するには、Notification Content Extensionタイプの新しいターゲットを追加する必要があります。Xcodeは自動的にUIViewControllerを継承し、UNNotificationContentExtensionを実装するコントローラー付きのMainInterface.storyboardを作成します。

ターゲット拡張機能の追加

XcodeでFile → New → Target → Notification Content Extensionを選択します。拡張機能の名前、言語(SwiftまたはObjective-C)を指定し、プロジェクトが同じ開発者チームに接続されていることを確認します。ターゲット作成後、MainInterface.storyboard、Info.plist、コントローラーファイルの3つのファイルを含むフォルダーが表示されます。

Info.plistの設定

拡張機能のInfo.plistでは、UNNotificationExtensionCategoryキーを持つNSExtensionAttributes配列を必ず指定する必要があります。この配列には、拡張機能がアクティブになる通知カテゴリの識別子が含まれます。オプションのキーUNNotificationExtensionInitialContentSizeRatioは、正しい配置のためにカスタムインターフェースの初期アスペクト比を設定します。

拡張機能フォルダーのアーキテクチャ

ターゲット拡張機能ではクリーンなアーキテクチャを維持することをお勧めします:コントローラー用の別フォルダー、カスタムView用の別フォルダー。拡張機能は別のバイナリであるため、メインアプリケーションのコードに直接アクセスできません。コードを共有するには、別のフレームワークを作成するか、データ用にApp Groupを使用します。

UNNotificationContentExtensionプロトコルの実装

UNNotificationContentExtensionは、Notification Content Extensionのコントローラーが実装する必要があるプロトコルです。唯一の必須メソッドは、通知受信時に呼び出されるdidReceive(_:with:)です。コントローラーは通知と、データで更新する必要のある準備済みのビューコントローラーを受け取ります。

コントローラーの基本実装

拡張機能のコントローラーはUIViewControllerを継承し、UNNotificationContentExtensionを実装する必要があります。Storyboardまたはxibはこのコントローラーにリンクされます。通知を受信すると、didReceiveメソッドがコンテンツを渡し、コントローラーがそのビューを更新します。

swift
import UIKit
import UserNotifications
import UserNotificationsUI

class CustomNotificationViewController: UIViewController {

    @IBOutlet var titleLabel: UILabel!
    @IBOutlet var customImageView: UIImageView!

    func didReceive(
        notification: UNNotification
    ) {
        let content = notification.request.content
        titleLabel.text = content.title
        loadAttachment(content.attachments.first)
    }

    private func loadAttachment(attachment: UNNotificationAttachment?) {
        guard let url = attachment?.URL else { return }
        if let image = UIImage(contentsOfFile: url.path) {
            customImageView.image = image
        }
    }
}

extension CustomNotificationViewController: UNNotificationContentExtension {
    func didReceive(
        notification: UNNotification
    ) {
        didReceive(notification: notification)
    }
}

インターフェースサイズの制御

システムは、Info.plistのUNNotificationExtensionInitialContentSizeRatioキーと現在のコンテンツに基づいて、カスタムインターフェースのサイズを決定します。最小初期サイズのためにはこのキーを0.1に設定し、コンテンツ読み込み後にpreferredContentSizeでサイズを変更することをお勧めします。

インターフェースのカスタマイズとインタラクティビティ

Notification Content Extensionはインターフェース作成において完全な自由を提供します。UITableView、MKMapView、WKWebView、UIStackViewなど、任意のUIKitコンポーネントを使用できます。ただし、通知の限られたスペースを考慮し、パフォーマンスを最適化することが重要です。

通知への地図の追加

人気のあるユースケースの1つは、位置情報付きの地図を表示することです。これには、拡張機能のStoryboardにMKMapViewを追加し、コントローラーが通知コンテンツから座標を渡します。拡張機能のターゲットにMapKitを追加することを忘れないでください。地図を使用する際は、拡張機能のメモリ制限を考慮してください — 複雑なタイルの読み込みが利用可能なリソースを超える可能性があります。

アニメーションとトランジション

Notification Content Extensionは、サイズ変更、移動、要素の透明度を含むUIViewアニメーションをサポートしています。通知の拡張モードに入るときに、コンテンツ出現のアニメーションを開始できます。アニメーションは短く(0.5秒まで)、ユーザーの通知操作を妨げないようにする必要があります。無限アニメーションは避けてください — バッテリーを消費し、パフォーマンスを低下させます。

カスタムインターフェースのタップ処理

拡張機能は完全なUIViewControllerであるため、ジェスチャーやタップハンドラーを追加できます。UIKitジェスチャー(UITapGestureRecognizer、UIButton)は標準的に動作します。アプリケーションの起動を必要とするアクションには、拡張機能のデリゲートまたはuserNotificationCenterを使用してください。インタラクティブ要素は、限られたスペースで快適にタップできる十分な大きさである必要があります — Appleの推奨に従い、最小タッチターゲットサイズは44x44ポイントです。

メディアと添付ファイルの操作

メディアコンテンツはNotification Content Extensionの主要な機能です。通知には、カスタムインターフェースに表示される画像、GIF、オーディオ、ビデオを含めることができます。添付ファイルはUNNotificationAttachmentを介して配信され、サーバーがペイロード経由で追加するか、Notification Service Extensionがダウンロード後に追加できます。JPEG、PNG、MPEG-4、MP3形式がサポートされています。

拡張機能でのメディア表示

画像を表示するには、通知コンテンツからUNNotificationAttachmentを取得し、ローカルURLから読み込むだけです。拡張機能はローカルファイルにのみアクセスできることに注意してください — リモートリソースは事前にService Extensionがダウンロードする必要があります。最大サイズはiOS 15+で50 MBで、以降のアップデートで制限が変わります。複数の画像をサポートするには、異なる識別子を持つUNNotificationAttachmentを使用し、UIPageViewControllerを介して表示します。

画像の読み込みと表示

カスタムインターフェースに画像を表示するために、拡張機能は通知コンテンツからUNNotificationAttachmentを取得し、ローカルURLから読み込みます。添付ファイルは事前にNotification Service Extensionによってダウンロードされている必要があります — Content Extensionはネットワークアクセスを持っていません。メディア添付ファイルの最大サイズはiOS 15+で50 MB、それ以前のバージョンでは10 MBでした。拡張機能は添付ファイルの不在を適切に処理し、フォールバックインターフェースを表示する必要があります。低解像度の画像をプリロードするには、Service Extensionが添付前に作成したサムネイルバージョンを使用します。

通知でのビデオ再生

iOSはAVPlayerLayerを介してNotification Content Extensionでのビデオ再生をサポートしています。拡張機能は通知内にコントロールボタン付きのビデオプレーヤーを表示できます。これは特に監視アプリケーション、ストリーミング、コンテンツプレビューに役立ちます。ユーザーがこの通知でメディアコンテンツを期待している場合、自動再生は無音であれば許可されます。ビデオプレーヤーを実装する際は、コントロール要素(再生/一時停止、プログレスバー、閉じるボタン)を追加してください。ビデオが自動的に音声付きで開始しないことを確認してください — これはAppleのユーザーエクスペリエンスに関する推奨事項に違反します。複数の画像によるスライドショーには、ページめくりのトランジションオプション付きのUIView.transitionを介したアニメーショントランジションを使用します。

拡張機能のパフォーマンス最適化

Notification Content Extensionは約50 MBのメモリ制限がある制限された環境で動作します。パフォーマンスを最適化するには、画像の遅延読み込みを使用し、メインスレッドでの重い計算を避け、シンプルな制約でAuto Layoutを適用します。画像処理やデータ解析などの重い操作はバックグラウンドキュー(DispatchQueue.global)で実行します。メモリ制限を超えると、システムは拡張機能を終了し、ユーザーは標準の通知を表示します。公開前にInstruments(AllocationsとTime Profiler)を介して拡張機能をプロファイリングし、異なるiOSバージョンの実機でメモリ使用量を確認することをお勧めします。

よくある質問

Notification Content ExtensionでSwiftUIを使用できますか?

はい、iOS 16以降、Notification Content ExtensionはUIHostingControllerを介してSwiftUIをサポートしています。ただし、拡張機能でのSwiftUIのサポートが限られているため、複雑なインターフェースにはUIKitの方が安定した選択肢です。

なぜ拡張機能が私の通知でアクティブにならないのですか?

通知のペイロード内のcategoryIdentifierが拡張機能のInfo.plist内のUNNotificationExtensionCategoryと一致していることを確認してください。また、拡張機能がメインアプリのターゲットに追加され、正しく署名されていることを確認してください。

メインアプリケーションから拡張機能にデータを渡すには?

App Group — 共有ストレージ(UserDefaults suite)またはファイルコンテナを使用します。メインアプリケーションと拡張機能は同じ開発者グループに属し、App Groups機能が有効になっている必要があります。

新しい通知なしで拡張機能のコンテンツを更新するには?

メディア制御にはdidReceive(_:with:) with UNNotificationContentExtensionMediaPlayPauseButtonTypeメソッドを使用するか、デリゲートを介して更新を要求します。新しい通知なしでの完全なコンテンツ更新はできません。

Notification Content Extensionをデバッグするには?

Xcodeで拡張機能のターゲットを選択し、シミュレーターで実行します。通常のアプリケーションと同様にlldbとブレークポイントを使用します。テストするには、Firebase Consoleを介してプッシュ通知を送信するか、ローカルでPusherを介して送信します。

まとめ

  • Notification Content Extension — プッシュ通知のカスタム表示のためのiOS拡張機能。
  • 拡張機能はUNNotificationContentExtensionを実装し、完全なUIKitインターフェースを提供します。
  • 一致するcategoryIdentifierを持つ通知に対してアクティブになります。
  • 地図、画像、ビデオ、アニメーションなど、任意のUIコンポーネントをサポートします。
  • App Groupを介したアクセスで隔離されたプロセスで動作します。
  • サイズ制限 — 展開された拡張機能で50 MB
  • メディアコンテンツには、Service Extensionが準備したUNNotificationAttachmentを使用します。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください