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 × CallKit + PushKit で VoIP 通話アプリを実装する — Native 着信 UI と専用 Push の本番運用

Rork で作った通話アプリに CallKit + PushKit を組み込み、ネイティブ着信 UI と VoIP 専用 Push を本番運用する手順を、トークン管理・audio session・審査リスクまで含めて解説します。

Rork515CallKitPushKitVoIPPush通知WebRTC4iOS108React Native209通話アプリ

プレミアム記事

「Rork で通話アプリを作っているのですが、画面が消えている状態で着信が鳴りません」というご相談を、最近とても多くいただきます。多くの場合、原因は通常の Push 通知(FCM/APNs)に頼っていることです。iOS の VoIP 通話で「ロック画面に全画面の着信 UI を出す」「相手の声を即座に再生する」を成立させるには、CallKit と PushKit という、通常の通知系とは別系統の API を組み合わせる必要があります

私自身、過去に WebRTC を使った通話アプリを Rork で書き始めて、最初の数日は「なぜ実機で着信が鳴らないのか」をひたすら追いかけていた時期がありました。CallKit のドキュメントは断片的で、Rork(React Native)からネイティブモジュール経由で扱う情報はさらに少ない領域です。ここで扱うのは私が本番運用にたどり着くまでに整理した知見を、Rork で開発している方が同じ落とし穴を避けられる形でまとめました。

この記事は Rork(React Native)Rork Max(SwiftUI ネイティブ) の両方の開発フローを念頭に置いています。前者では react-native-callkeep + react-native-voip-push-notification をベースに、後者では PushKit / CallKit のネイティブ実装を直接扱います。

なぜ通常の Push では VoIP 通話が成立しないのか

最初に、なぜわざわざ別の API が必要なのかという「設計の理由」から整理させてください。これを納得しておくと、後の実装で迷ったときに正しい判断ができるようになります。

通常の APNs 通知(alert / sound / badge)は、ユーザーが通知センターを開いてアプリをタップして初めてアプリが起動します。つまり「相手が今すぐ電話に出られる状態」を作るには遅すぎるのです。一方 PushKit を使うと、pushType: voip の Push が届いた瞬間に iOS がアプリのプロセスをバックグラウンドで起こし、CallKit の reportNewIncomingCall を呼ぶチャンスを与えてくれます。

ただし iOS 13 以降は、PushKit を受け取ったら 「30 秒以内に CallKit に着信を報告しなければアプリを kill する」 という厳しい制約が課されています。これを満たさないアプリは、繰り返し違反するとそのデバイスでの VoIP Push を受け取れなくなります。CallKit に必ず通すという設計は守らなければいけません。

ここで併せて理解しておきたいのが「VoIP Push を別のことに使えないか?」という誘惑です。たとえばチャットの新着メッセージや、AI のレスポンス完了通知をバックグラウンドで処理したくなる場面があります。しかし Apple は VoIP Push を実際の通話用途以外で使うアプリをリジェクトしており、過去に多くの大手アプリが書き換えを迫られています。VoIP Push はあくまで「鳴らす電話」のために使うと割り切ってください。

アーキテクチャ全体像 — どのレイヤーが何を担当するか

本番で動く VoIP 通話アプリは、おおよそ次のようなレイヤーで構成されます。Rork で開発する場合、JavaScript レイヤーから iOS のネイティブ機能に橋渡しする「ブリッジ」の存在を意識する点が肝心です。

  • シグナリングサーバ: 誰が誰に電話をかけたかを伝えるサーバ(Cloudflare Workers + Durable Objects、Supabase Realtime、自前 WebSocket など)
  • VoIP Push サーバ: APNs に対して apns-push-type: voip を投げるバックエンド
  • PushKit レイヤー(iOS ネイティブ): VoIP Push を受信し CallKit に転送
  • CallKit レイヤー(iOS ネイティブ): 着信 UI の表示、通話状態の管理、audio session の制御
  • WebRTC レイヤー(共通): 実際の音声・映像のメディア接続
  • JS レイヤー(Rork): 通話履歴、UI、ビジネスロジック

Rork(React Native)の場合、CallKit と PushKit は OSS の react-native-callkeepreact-native-voip-push-notification がブリッジを提供してくれます。Rork Max(SwiftUI ネイティブ)の場合は、PushRegistryCXProvider を直接扱います。ここで扱うのは両方のサンプルコードを示します。

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

この記事の続きを読む

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

この記事で得られること
VoIP 通話アプリでロック画面の着信 UI が出ない/鳴らない問題で詰まっていた人が、PushKit + CallKit を正しく繋ぎ込んで本番で動く実装を手に入れられる
PushKit トークンの取得・更新・サーバ送信、audio session の切り替え、CallKit からの WebRTC 接続まで、本番運用に必要な全レイヤーのコードを習得できる
App Store 審査で VoIP 用途として認められるためのガイドライン適合と、リジェクトされた場合の修正方針を、自分のアプリに当てはめて判断できる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

開発ツール2026-07-02
Rork のビデオ通話が『つながっているのに片方だけ聞こえない』とき — WebRTC の沈黙する失敗を計測して切り分ける運用メモ
Rork で作ったビデオ通話が本番でだけ片方向音声になる・地下鉄で静かに切れる問題を、WebRTC の getStats で計測して切り分ける運用メモ。ICE 再起動・TURN リレー確認・後始末の実装まで。
開発ツール2026-06-22
毎朝違う一言を出す日替わりリマインダーが、ある日から鳴らなくなる——iOSの保留64件という見えない上限
Rork(Expo)で作った日替わりリマインダーが、しばらく経つと無言で止まる原因はiOSの保留通知64件上限です。固定文言のカレンダートリガーと、日替わりコンテンツのローリング再スケジュールを動くコードで設計し、サマータイムや複数リマインダー併用でも狂わない通知を組みます。
開発ツール2026-05-28
Rork アプリで iOS の BGTaskScheduler.submit が Error Code=1 で失敗するときの切り分け手順
Rork で作った iOS アプリで BGTaskScheduler.submit が Error Code=1 (Unavailable) を返してバックグラウンド更新が動かないときに、原因をひとつずつ潰していくための実用チェックリストです。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →