Notification Content Extension — これは、プッシュ通知の標準テンプレートを完全にカスタムなユーザーインターフェースに置き換えるiOS拡張機能の一種です。開発者は、通知内に画像、オーディオプレーヤー、アクションボタン、プログレスバー、カスタムアニメーションを表示でき、標準のバナーを本格的なミニアプリケーションに拡張できます。WWDC 2025のデータによると、この拡張機能はUNNotificationContentExtensionを使用し、1つの通知で最大4つのメディア添付ファイルをサポートし、UNNotificationActionを介したインタラクティブなアクションの処理も行います。
重要なポイント
Notification Content Extension — これは、iOS上のプッシュ通知の表示をオーバーライドするアプリ拡張機能です。タイトル、メッセージ本文、ボタンがある標準のバナーの代わりに、Interface Builderで完全に開発されたインターフェースや、UIKitまたはSwiftUIを介してプログラムで作成されたインターフェースを表示できます。
表示前にコンテンツを変更するNotification Service Extensionとは異なり、Content Extensionは視覚的表現のみを担当します。拡張機能はすべての変更が行われた後の準備済み通知を受け取り、どのように表示するかを決定します。これが2種類の通知拡張機能の主な違いです。
拡張機能は、ユーザーが拡張ジェスチャー(通知を下にスクロールするか、デバイスモデルに応じて通知をクリックする)を実行するとアクティブになります。iOSは拡張機能プロセスを起動し、指定されたnibまたはstoryboardからコントローラーを作成し、UNNotificationContentExtensionを介して通知を渡します。
開発は、XcodeでNotification Content Extensionテンプレートを使用して新しいtargetを追加することから始まります。XcodeはMainInterface.storyboardファイルと、UNNotificationContentExtensionプロトコルを実装するUIViewControllerを継承するクラスを作成します。
カスタム領域の最大高さは、iPhone(大型画面モデルの場合)で320ポイント、iPadで352ポイントです。これらの境界を超えるコンテンツは切り取られます。さまざまなサイズに適応するには、スクロール可能なコンテンツにAuto LayoutとUIScrollViewを使用することをお勧めします。幅は常に通知の幅と等しく、デバイスの回転時に自動的に変更されます。
Apple Human Interface Guidelinesは次のように警告しています:通知インターフェースは簡潔で、画像、プレーヤー、マップ、クイック入力フォームの1つの主要要素のみを含むべきです。複数のインタラクティブ要素はユーザーを圧倒し、操作を複雑にします。
App Group — 拡張機能とメインアプリケーション間のデータ交換の唯一のメカニズムです。App Groupの共有ディレクトリを介して、キャッシュされた画像、トークン、設定を転送できます。プロセスの分離のため、メインアプリケーションのAPIの直接呼び出しやそのUserDefaultsへのアクセスは利用できません。
class NotificationViewController: UIViewController {
func didReceive(
_ notification: UNNotification
) {
guard let attachment = notification
.request.content.attachments.first()
else { return }
if attachment.url.startAccessingSecurityScopedResource() {
imageView.image = UIImage(contentsOfFile:
attachment.url.path)
attachment.url.stopAccessingSecurityScopedResource()
}
}
}
UNNotificationContentExtension — カスタム通知のライフサイクルを定義するメインプロトコルです。プロトコルは、コンテンツの受信、アクションの処理、インターフェースの管理のためのメソッドを提供します。
didReceive(_:with:)は通知を受信したときに呼び出されます。拡張機能は、メディアプレーヤーを管理するためのUNNotificationオブジェクトとUNNotificationContentExtensionMediaPlayPauseButtonTypeを受け取ります。このメソッドでは、インターフェースを設定する必要があります—画像の読み込み、プレーヤーの初期化、データの表示など。システムは、リアルタイムで通知が更新されるたびにこのメソッドを呼び出します。
拡張機能には実行のための制限時間があることに注意することが重要です—完全な表示サイクルで約30秒です。この時間内にインターフェースが準備されない場合、iOSはシステム通知を表示します。重いリソース(ネットワークからの画像読み込み、ビデオデコードなど)については、App Groupを介した事前キャッシュを使用した非同期操作をお勧めします。
プロトコルには、play/pauseボタンのためのオプションのメソッドが含まれています:mediaPlay、mediaPause、mediaPlayPauseButtonType。通知にオーディオまたはビデオコンテンツが含まれている場合、拡張機能はシステムコントロール要素を備えた組み込みプレーヤーを表示できます。適切なボタンタイプを返すと、iOSは自動的に拡張機能の右上隅に再生ボタンを追加します。
UNNotificationAttachment — 通知に添付されたメディアデータを含むオブジェクトです。画像、オーディオファイル、ビデオは、サーバー上またはNotification Service ExtensionでUNNotificationAttachmentを介して通知作成段階で追加されます。
画像:JPEG、PNG、GIF、HEIF。オーディオ:MP3、AAC、ALAC、WAV。ビデオ:MPEG-4、H.264、HEVC。各添付ファイルの最大サイズは50 MB、1通知あたり最大4つの添付ファイルです。システムは通知表示前にバックグラウンドで自動的に添付ファイルをダウンロードし、security-scopedリソースを介して拡張機能にローカルURLへのアクセスを提供します。
Appleによると、拡張機能は自分でメディアをダウンロードすべきではありません—システムによるダウンロード完了後、UNNotificationAttachmentにはすでにローカルURLが含まれています。ただし、添付ファイルが時間通りに読み込まれなかった場合(例:接続不良)、拡張機能はプレースホルダーまたは代替テキストを表示できます。
各UNNotificationAttachmentはsecurity-scoped URLを提供し、拡張機能はstartAccessingSecurityScopedResource()を介してアクセスし、stopAccessingSecurityScopedResource()を介して解放する必要があります。これらのメソッドはペアで呼び出す必要があります—そうしないとリソースが解放されず、アクセス権限がリークします。
let attachment = notification.request.content.attachments.first()
guard attachment.url.startAccessingSecurityScopedResource()
else { return }
defer { attachment.url.stopAccessingSecurityScopedResource() }
let data = try Data(contentsOf: attachment.url)
imageView.image = UIImage(data: data)
Notification Content Extensionは、カスタムインタラクティブアクション—通知コンテンツの下に表示されるボタン—をサポートします。アクションは、UNNotificationCategoryを介して通知カテゴリを作成する際に登録され、破壊的、テキスト、またはバックグラウンドにすることができます。
UNNotificationAction — タイトルとオプションの破壊的フラグを持つ単純なアクションです。UNTextInputNotificationAction — テキスト入力フィールドを持つアクションで、例えばメッセージへのクイック返信のためです。両方のタイプはUNNotificationActionOptions.authenticationRequiredオプションをサポートします—実行前にデバイスのロック解除が必要です。
拡張機能は、選択されたアクションをdidReceive(_:withCompletionHandler:)メソッドを介して受け取り、アクション識別子とオプションのテキストを含むUNNotificationResponseオブジェクトが渡されます。拡張機能は応答を自分で処理するか、共有のApp Groupコンテナを介してメインアプリケーションに渡すことができます。
let category = UNNotificationCategory(
identifier: "message",
actions: [
UNTextInputNotificationAction(
identifier: "reply",
title: "Reply",
options: .authenticationRequired
),
UNNotificationAction(
identifier: "mark_read",
title: "Mark Read",
options: .foreground
)
],
intentIdentifiers: []
)
よくある質問
Content Extensionは通知の視覚的表示を担当し、Service Extensionは表示前にコンテンツを変更することを担当します。Content ExtensionはService Extensionの後に動作し、通知のペイロードを変更できません。
SwiftおよびObjective-C(UIKit用)。iOS 16以降、SwiftUIもNotificationContentViewを介してサイズおよび設定モディファイア付きで通知インターフェースの作成にサポートされています。
はい、iOS 16以降、拡張機能はUIHostingControllerを介してSwiftUIを使用できます。ただし、UIKitのすべての能力—サイズ、制約、security-scopedリソース—は保持され、SwiftUIコンテンツに適用されます。
1通知あたり最大4つの添付ファイル。各添付ファイルのサイズは最大50 MB。サポートされる形式:画像(JPEG、PNG、HEIF)、オーディオ(MP3、AAC)、ビデオ(MPEG-4、H.264)。
App Groupを介して—ディスク上の共有ディレクトリ。app groupサフィックス付きのUserDefaultsも機能します。拡張機能プロセスの分離のため、メインアプリケーションAPIへの直接呼び出しは利用できません。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。