RORK LABEN
TOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しましたTOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しました
記事一覧/開発ツール
開発ツール/2026-05-01上級

Rork × Notification Service Extension 本番実装ガイド — 画像付き通知・暗号化ペイロード・通知の動的書き換えで開封率を底上げする

Rork で作ったアプリに Notification Service Extension を組み込み、画像付き通知・E2E暗号化ペイロードの復号・APNs ペイロードの動的書き換えを本番品質で実装する設計と落とし穴を、動作する Swift コードとともに解説します。

Rork515Notification Service ExtensionRich PushAPNs3Swift48iOS108プッシュ通知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-17
許可を聞かずに通知を届ける — Rork アプリの provisional 認可と、Expo の定番コードが握りつぶすもの
iOS には許可ダイアログを出さずに通知を配り始める provisional 認可があります。ところが Expo 公式が載せている定番の登録コードをそのまま使うと、provisional で通った端末が「拒否」として扱われ、避けたかったはずのダイアログが出ます。granted が false になる仕組みから、5値で許可状態を扱うフック、静かな配信を前提にした通知設計、昇格を求める判断、計測の分離までを実装込みで整理しました。
開発ツール2026-07-17
Rork の App Store 提出が「輸出コンプライアンス」で毎回止まるのを設定1行で終わらせる
Rork と Rork Max のビルドを App Store Connect に上げるたびに出る Missing Compliance 警告。免除の判断基準と、app.json / Info.plist で恒久的に消す設定、消えない場合の原因を整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →