PushKitは、標準のAPNsをバイパスして低遅延のVoIP通知を配信するiOSフレームワークです。Apple Developer Documentation (2025)によると、PushKitはバックグラウンドでも5秒以内にコールを配信することを保証します。VoIP通知は直接処理され、ユーザーにバナーを表示する必要がないため、このフレームワークはiOS上のメッセンジャーやビデオ通話アプリの主要なツールとなっています。
主要ポイント
PushKitはAppleがiOS 8で導入したフレームワークで、VoIPアプリケーション向けに低遅延のプッシュ通知を提供します。標準のAPNs(Apple Push Notification service)とは異なり、PushKitは着信コールを受信したときにアプリがバックグラウンドで起動することを可能にし、ユーザーに通知を表示しません。これは音声およびビデオ通話アプリにとって重要です — アプリが閉じられていても、ユーザーは即座にコールを受信します。Apple WWDC 2024によると、PushKitは世界中で毎日20億以上のVoIP通知を処理しています。
この仕組みは、デバイスとAppleのプッシュサーバー間の直接接続に基づいており、標準の通知チャネルをバイパスします。アプリサーバーがVoIP通知を送信すると、専用のPushKitサーバーを通過し、最大優先度でデバイスに配信されます。システムはバックグラウンドでアプリを起動し、デリゲートメソッドpushRegistry:didReceiveIncomingPushWithPayload:forType:を呼び出します。アプリはペイロードを受信し、コールを処理し、確認のために完了ハンドラを呼び出します。Appleの仕様によると、送信から処理までの全サイクルは5秒以内です。
PushKitとAPNsの主な違いは配信メカニズムと処理にあります。APNsはバナー、サウンド、バッジを表示する標準の通知チャネルを使用しますが、PushKitは視覚的通知なしでアプリに直接データを配信します。以下は主な特性の比較表です。
| 特性 | PushKit | APNs |
|---|---|---|
| 配信優先度 | 高(即時配信) | 中(遅延の可能性あり) |
| アプリ起動 | はい、バックグラウンドで | 通知をタップした時のみ |
| バナー表示 | いいえ | はい(オプション) |
| 使用用途 | VoIP、通話、ビデオ通話 | すべてのタイプの通知 |
| ペイロード | JSONのみ、メディアなし | JSON + 添付ファイル |
PushKitはリッチメディア添付ファイルもサポートしておらず、通常のマーケティング通知には使用できません。AppleはPushKitの使用を厳格に管理しています — アプリに明示的なVoIP機能が必要であり、そうでない場合はレビューで却下されます。APNsは他のすべてのシナリオにおいて汎用的なソリューションであり続けています。
PushKitを使用するには、アプリはPKPushRegistryを使用してpushType .voIPで登録する必要があります。登録は初回起動時に一度だけ実行され、その後システムが一意のプッシュトークンを生成し、デリゲートを介して渡します。このトークンは後続のVoIP通知送信のためにアプリサーバーに送信されます。以下はSwiftでのPushKit登録とトークン取得の例です。
import PushKit
let registry = PKPushRegistry(queue: DispatchQueue.main)
registry.delegate = self
registry.desiredPushTypes = [.voIP]
// MARK: - PKPushRegistryDelegate
func pushRegistry(
_ registry: PKPushRegistry,
didUpdate pushCredentials: PKPushCredentials,
for type: PKPushType
) {
let deviceToken = pushCredentials.token
.map { String.format("%02x", $0) }
.joined()
sendVoIPTokenToServer(deviceToken)
}
PKPushType.voIPでdesiredPushTypesを呼び出した後、システムは自動的にVoIP通知を受信する許可を要求します。pushRegistry:didUpdatePushCredentials:forType:メソッドで、アプリはデバイストークンをDataとして受信し、それを16進文字列に変換してサーバーに送信します。トークンはデバイスごとに一意であり、アプリの再インストール時に変更されます — サーバーはトークンの更新を処理する必要があります。
func pushRegistry(
_ registry: PKPushRegistry,
didReceiveIncomingPushWith payload: PKPushPayload,
for type: PKPushType,
completion: @escaping VoidBlock
) {
guard let caller = payload.dictionaryPayload["caller"] as? String else {
completion()
return
}
let update = CXCallUpdate()
update.remoteHandle = CXHandle(type: .generic, value: caller)
provider.reportNewIncomingCall(
with: UUID(),
update: update,
completion: { error in
if let error = error {
print("Call error: \(error)")
}
completion()
}
)
}
didReceiveIncomingPushWithメソッドで、アプリはコールデータとともにペイロードを受信します。発信者情報を抽出した後、CallKitフレームワークからCXCallUpdateを作成して着信コール画面を表示します。処理後に完了ハンドラを呼び出すことが重要です — そうしないと、システムがタイムアウトによりアプリプロセスを強制終了する可能性があります。最大処理時間は30秒で、その後iOSは通知を未処理とみなします。
PushKitはCallKitと緊密に統合されています — iOSでシステムコールインターフェースを表示するためのフレームワークです。アプリがPushKitを介してVoIP通知を受信すると、コールを管理するためにCXProviderとCXCallControllerを作成する必要があります。CallKitはアプリが最小化されていても、ロック画面に着信コール画面を自動的に表示します。以下はCallKitプロバイダーの設定例です。
let config = CXProviderConfiguration(localizedName: "MyApp")
config.supportsVideo = true
config.maximumCallGroups = 1
config.maximumCallsPerCallGroup = 1
config.supportedHandleTypes = [.phoneNumber, .generic]
let provider = CXProvider(configuration: config)
provider.setDelegate(self, queue: nil)
CXProviderConfigurationはコール画面の外観と動作を定義します — アプリ名、ビデオサポート、同時通話数。VoIPアプリにはPushKitとCallKitの統合が必須です:これがないと、システムは着信コール画面を表示せず、ユーザーはコールを見逃します。AppleはPushKitを使用するすべてのアプリにCallKitの使用を要求しています。
PushKitの使用には、Appleが設定したいくつかの厳格な制限が伴います。このフレームワークはVoIP機能にのみ使用できます — PushKitを介してマーケティング通知を送信しようとすると、アプリがブロックされます。ペイロードサイズは4 KBを超えてはならず、添付ファイルなしのJSONデータのみを含めることができます。iOS 13以降、AppleはVoIP通知の送信頻度に制限を導入しました — デバイスあたり1分間に1通知までです。サーバーはこの制限に従わなければなりません。そうしないと、通知はシステムによって拒否されます。PushKitはiOSシミュレーターでも動作しません — テストは物理デバイスでのみ可能です。
VoIP通知のペイロードは、カスタムコールデータを含むJSONディクショナリです。APNsとは異なり、PushKitは標準のalert、badge、soundフィールドをサポートしていません — すべてのデータは開発者によって定義されます。典型的な構造には、発信者識別子(caller)、コールタイプ(音声またはビデオ)、ルームまたはセッション識別子、タイムスタンプが含まれます。4 KBの制限内でスペースを節約するため、各フィールドのサイズは最小限に抑える必要があります。Appleは、ロック画面に着信コール画面を表示するために必要なデータのみをペイロードに含め、残りの情報(アバター、メッセージ履歴)はユーザーが応答した後に別のネットワークリクエストを介してロードすることを推奨しています。最小ペイロードの例:{ "caller": "アンナ", "caller_id": "+79161234567", "type": "audio", "room": "uuid-room-1234", "ts": 1718534400 }。ペイロード内のすべてのキーは短く、明確で、アプリバージョン間の互換性のためにサーバー側で文書化される必要があります。
PushKitを扱う際には、配信障害と接続損失を処理する必要があります。デバイスがオフラインであるかネットワークから切断されている場合、VoIP通知は配信されません — PushKitは保存と再送信をサポートしていません。再試行のために最大24時間通知を保存するAPNsとは異なります。サーバーは未配信の通知を独立して追跡し、接続が復元されたときに再試行する必要があります。これにはpush kit feedback serviceメカニズムが使用されます — 障害理由とともに未配信通知のリストを返します。サーバー分析を通じてVoIP通知配信成功の監視を設定し、成功配信率が95%を下回った場合に開発者に通知することを推奨します。PushKitシステムは、デバイスがアクティブなインターネット接続を持っている場合にのみ配信を保証します — 接続がない場合、通知は永久に失われます。これは、保証付き配信を備えた信頼性の高いVoIPコールシステムを設計する際に考慮することが重要です。
よくある質問
PushKitは、バナーを表示せずに着信コール時にアプリがバックグラウンドで起動できるようにする、低遅延のVoIP通知を配信するAppleのフレームワークです。メッセンジャーやビデオ通話アプリで使用されています。
PushKitは配信優先度が高く、ユーザーに通知を表示せずにバックグラウンドでアプリを起動します。APNsはバナー付きで通知を配信し、ユーザーの操作なしではコール処理のためにアプリを起動できません。
はい、Appleはシステムの着信コール画面を表示するためにPushKitとCallKitの統合を要求しています。CallKitがないと、アプリはロック画面に着信コールを表示できず、VoIP機能が無意味になります。
トークンは、.voIPタイプでPKPushRegistryを作成し、pushRegistry:didUpdatePushCredentials:forType:デリゲートメソッドを実装した後に取得されます。トークンはDataとして渡され、サーバーに送信するために16進文字列に変換する必要があります。
PushKitの最大ペイロードサイズは4 KBです。データはJSON形式である必要があります。メディア添付ファイルはサポートされていません。iOS 13以降、デバイスあたり1分間に1件までのVoIP通知制限があります。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。