RORK LABEN
DEADLINE — Google Play は2026年8月31日以降、新規アプリと既存アプリの更新の双方に対象 API レベル36(Android 16)以上を要求します。残り13日ですEXTENSION — 期限に間に合わない場合は Play Console の期限延長フォームから申請することで11月1日まで配信を継続できます。延長は自動ではなく、申請自体を期限内に行う必要がありますTARGET SDK — Rork などのビルダーが出力する Expo / React Native アプリでも targetSdkVersion は自分で確認が必要です。テンプレートが古い SDK に固定されていると生成しただけでは要件を満たしませんPOLICY — スパムと最低限の機能に関するポリシーが改定され、高品質な機能とコンテンツ体験が求められます。薄いアプリを量産する運用は正面から影響を受ける領域ですPRIVACY — 収集するデータの項目・用途・第三者への共有の有無について詳細な説明が求められます。ビルダーが自動で組み込む解析 SDK や広告 ID も申告の対象ですRORK — 従来の Rork が React Native / Expo を出力するのに対し、Rork Max は SwiftUI を生成します。無料枠から始められ、有料プランは月25ドルからですDEADLINE — Google Play は2026年8月31日以降、新規アプリと既存アプリの更新の双方に対象 API レベル36(Android 16)以上を要求します。残り13日ですEXTENSION — 期限に間に合わない場合は Play Console の期限延長フォームから申請することで11月1日まで配信を継続できます。延長は自動ではなく、申請自体を期限内に行う必要がありますTARGET SDK — Rork などのビルダーが出力する Expo / React Native アプリでも targetSdkVersion は自分で確認が必要です。テンプレートが古い SDK に固定されていると生成しただけでは要件を満たしませんPOLICY — スパムと最低限の機能に関するポリシーが改定され、高品質な機能とコンテンツ体験が求められます。薄いアプリを量産する運用は正面から影響を受ける領域ですPRIVACY — 収集するデータの項目・用途・第三者への共有の有無について詳細な説明が求められます。ビルダーが自動で組み込む解析 SDK や広告 ID も申告の対象ですRORK — 従来の Rork が React Native / Expo を出力するのに対し、Rork Max は SwiftUI を生成します。無料枠から始められ、有料プランは月25ドルからです
記事一覧/開発ツール
開発ツール/2026-05-01上級

Rork アプリに Notification Service Extension を後付けする — 画像付き通知・暗号化ペイロード復号・動的書き換えの実装メモ

Rork で作った iOS アプリに Notification Service Extension を後付けし、画像付き通知・E2E暗号化ペイロードの復号・APNs ペイロードの動的書き換えを本番品質で動かすまでの設計と、実際に踏んだ落とし穴を、動作する Swift コードとともにまとめました。

Rork535Notification Service ExtensionRich PushAPNs3Swift48iOS109プッシュ通知19暗号化3

プレミアム記事

「同じプッシュ通知でも、画像付きとテキストだけでは開封率が2倍以上違う」— App Store の主要アプリを観察していると、画像通知を使いこなしているチームとそうでないチームの差が、リテンションと収益にそのまま響いていることが見えてきます。それなのに、Rork で作ったアプリに後から画像通知を組み込もうとして、「mutable-content: 1 を付けても画像が出ない」「Notification Service Extension(NSE)を作ったが30秒で落ちる」「テスト環境では出るのに本番だと出ない」と詰まっている方を、最近よく見かけます。

私自身、最初に NSE を実装したときは、Xcode のターゲット追加から App Group の設定、APNs ペイロードの仕様まで、断片的な情報を10個以上のドキュメントから拾い集める必要がありました。厄介だったのは、どのドキュメントも間違っていなかったことです。ただ、順番が書かれていませんでした。

そこで以下では、画像通知の最低限実装 → E2E 暗号化ペイロードの復号 → APNs ペイロードの動的書き換え → 出荷後に効く監視設計 という、私が結局たどり着いた順番のまま並べます。Rork で作ったアプリに後付けする前提で、動作する Swift コードを添えました。Rork Max でネイティブターゲットを生成済みのプロジェクトを想定していますが、Expo Bare ワークフローや React Native からの移行ケースでも同じ順番で通せます。

なぜ Notification Service Extension が必要なのか

iOS のプッシュ通知は、APNs(Apple Push Notification service)から送られたペイロードをそのまま画面に表示するのが基本動作です。しかしこの仕組みには、本番アプリで遭遇する3つの大きな制約があります。

ひとつ目は、画像・動画・音声などの添付ファイルは APNs のペイロードに直接乗せられないこと。ペイロード上限は 4096 バイト(HTTP/2 経由なら 4KB)しかなく、Retina 用の画像 1 枚すら入りません。代わりに、ペイロードに画像 URL を入れて、デバイス側でダウンロードしてから通知に貼り付ける必要があります。この「デバイス側で通知を加工する」処理を担うのが Notification Service Extension です。

ふたつ目は、APNs を経由するペイロードは Apple のサーバーに届く以上、平文では機密情報を載せられないこと。チャットアプリの本文や金融アプリの取引明細など、E2E 暗号化が前提の通知では、サーバー側で暗号化したペイロードを送り、デバイス側で復号してから表示する設計が必要になります。これも NSE で実装します。

みっつ目は、ユーザーごと・タイムゾーンごとの動的書き換えです。たとえば「あと3時間で締切」という通知を多言語で送る場合、サーバー側で全ユーザー分の文字列を生成するより、デバイス側のロケールに応じて NSE で書き換える方が、配信パフォーマンスもリージョン拡張性も高まります。

これら3つは、いずれも「APNs を信頼境界にしない」「デバイス側で最終加工する」という発想が共通しています。NSE はそのための公式に提供された唯一の手段であり、Rork で作ったアプリでも、ネイティブターゲットを開いて NSE を追加するだけで利用できます。

NSE が動く仕組み — 通知パイプライン全体像

実装に入る前に、NSE がどのタイミングで起動し、何ができて何ができないのかを整理しておきます。これを理解しておかないと、後で「30秒の制限」や「メモリ50MB」に詰まったときに、なぜ落ちているのか分からなくなります。

通常のプッシュ通知では、APNs から届いたペイロードがそのままシステム UI に渡され、通知センターやロック画面に表示されます。一方、ペイロードに mutable-content: 1 が含まれている場合、システムは通知をユーザーに見せる前に、アプリの NSE を起動し、UNNotificationServiceExtension のサブクラスに通知を渡します。

NSE 側では、didReceive(_:withContentHandler:) というメソッドが呼ばれ、ここで通知の内容を書き換えたり、画像をダウンロードして添付したり、暗号化されたペイロードを復号したりできます。処理が終わったら contentHandler を呼び出して、システムに加工後の通知を返します。

ここで重要なのが、処理に与えられる時間は最大30秒、メモリは約50MB までという制約です。30秒を超えた場合、システムは serviceExtensionTimeWillExpire() を呼び出して「あと少しで強制終了するから、できる範囲の結果を返せ」と通知します。これに応答せずに30秒を超えると、加工前のペイロードがそのまま表示されます。メモリ50MB は意外と厳しく、4K 画像をフルロードしただけでクラッシュすることもあるため、画像はダウンサンプルしながら扱うのが鉄則です。

また、NSE は本体アプリと同じプロセスでは動きません。別プロセス・別バンドル ID で動作するため、Keychain や UserDefaults を共有するには App Group の設定が必要です。本体側で保存した認証トークンを NSE から読みたい場合は、Keychain Access Group を共有する設計にしておきます。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
プッシュ通知に画像が出ない・開封率が伸びないと悩んでいた人が、本番で動く Rich Push 実装を今日手に入れられます
APNs ペイロードを暗号化して送信し、デバイス側で復号してから通知に表示する E2E 暗号化通知の設計と Swift コードを習得できます
30秒の処理時間制限と50MBのメモリ制限の中で、画像ダウンロード・ローカライズ・パーソナライズまでを安定して捌くNSEの本番品質パターンを身につけられます
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-06-25
通知が一部のユーザーにだけ届かない — Rork(Expo) アプリの到達率を診断して詰める設計
Rork で生成した Expo アプリで、プッシュ通知が一部のユーザーにだけ届かない問題を、送信から表示までの段に分けて診断し、到達率を計測して詰めるための設計を共有します。トークンの失効処理、APNs/FCM の失敗コード記録、優先度とメッセージ種別、特定ユーザーの切り分け手順まで実装込みで解説します。
開発ツール2026-07-27
最低サポート iOS をいつ上げるか — 利用率ではなく、コードに残った分岐の数で決める
最低サポート OS の引き上げを利用率で判断すると、毎年同じ結論になって先送りが続きます。OS 分岐に注記を付けて棚卸しし、引き上げ先ごとに消せる分岐を数えるスクリプトと、引き上げ後に見る指標をまとめました。
開発ツール2026-07-17
許可を聞かずに通知を届ける — Rork アプリの provisional 認可と、Expo の定番コードが握りつぶすもの
iOS には許可ダイアログを出さずに通知を配り始める provisional 認可があります。ところが Expo 公式が載せている定番の登録コードをそのまま使うと、provisional で通った端末が「拒否」として扱われ、避けたかったはずのダイアログが出ます。granted が false になる仕組みから、5値で許可状態を扱うフック、静かな配信を前提にした通知設計、昇格を求める判断、計測の分離までを実装込みで整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →