メインコンテンツへスキップ
VoIPプッシュ通知を使用すると、アプリがバックグラウンドや終了状態でも着信アラートを受信できます。AppleはVoIPプッシュを標準のプッシュ通知とは異なる方法で処理します。別の証明書タイプ、別のトークン(PushKit経由)、異なる配信ルールが使用されます。 OneSignalはVoIPプッシュの送信をサポートしていますが、OneSignal SDKはVoIPトークンの登録を処理しません。以下はお客様の責任となります:
  • Apple PushKitを使用してアプリでVoIPトークンを登録する
  • VoIP Services Certificateを使用した専用のOneSignalアプリを作成する
  • OneSignal REST APIを通じてトークンを登録し、プッシュを送信する

プラットフォームの違い

プラットフォームVoIPプッシュのサポート動作方法
iOSYesApple PushKitとVoIP APNs証明書を使用
AndroidNo通話スタイルの動作をシミュレートするためにデータのみのプッシュを使用
クロスプラットフォームの通話アプリを構築している場合、プラットフォームごとに異なるアプローチを使用することになります。

iOS:VoIPプッシュ通知を送信する

iOSでは、VoIP通知はApple PushKitを使用し、標準のプッシュ通知とは異なる特別な配信ルールに従います。AppleがVoIPプッシュを異なる方法で処理するため、OneSignalはVoIP用に別個のアプリ構成を必要とします。
開始する前に — VoIPセットアップで最もよくある間違いを挙げます:
  1. VoIP用に別個のOneSignalアプリを作成していない。 AppleはVoIPに異なる証明書タイプを要求するため、OneSignalはVoIPプッシュを送信するための専用アプリを必要とします。既存のプッシュアプリを両方に使用することはできません。
  2. 間違った証明書をアップロードしている。 標準のAPNsプッシュ証明書ではなく、**VoIP Services Certificate(.p12)**が必要です。間違ったものを使用すると、サイレントな配信失敗が発生します。
  3. サンドボックスでtest_typeを忘れている。 開発ビルドでテストする場合、トークンを登録するときに"test_type": 1を含める必要があります。これを省略すると、API呼び出しは成功しますが、プッシュが届きません。
1

PushKitを使用してVoIPトークンを登録する

AppleのPushKitフレームワークを使用してVoIP通知に登録し、VoIPトークンを受け取ります。
  • アプリにPushKitを実装する
  • AppleがローテーションするときにVoIPトークンを保存して更新する
  • AppleのVoIPポリシーに厳密に従う
import PushKit

class AppDelegate: NSObject, PKPushRegistryDelegate {
    func registerForVoIPPushes() {
        let registry = PKPushRegistry(queue: .main)
        registry.delegate = self
        registry.desiredPushTypes = [.voIP]
    }

    func pushRegistry(_ registry: PKPushRegistry, didUpdatePushCredentials credentials: PKPushCredentials, for type: PKPushType) {
        let token = credentials.token.map { String(format: "%02x", $0) }.joined()
        // このトークンをOneSignalに渡します — ステップ4を参照
    }
}
これは標準のApple PushKitコードです。OneSignalはPushKit SDKを提供していません — トークンをご自身で登録し、ステップ4でOneSignalに渡します。
Appleのリソース:
2

VoIP用の別個のOneSignalアプリを作成する

Apple VoIPプッシュは標準のプッシュ通知とは異なる証明書タイプを必要とします。1つのOneSignalアプリは1種類の証明書しか使用できないため、2つの別個のOneSignalアプリを作成する必要があります:
  • メインプッシュアプリ:標準のプッシュ通知用のAPNs証明書を使用
  • VoIPプッシュアプリ:VoIP専用の通知用のVoIP Services Certificateを使用
両方のアプリは同じiOS Bundle IDを使用し、同じネイティブiOSアプリに関連付けられている必要があります。OneSignal SDKを2回初期化する必要はありません — VoIPアプリはAPIを通じてVoIPプッシュを送信するためにサーバーサイドのみで使用されます。
Bundle ID(例:com.yourcompany.appname)は、XcodeのターゲットのGeneralタブで確認できます。
3

VoIP Services Certificateをアップロードする

VoIP OneSignalアプリで、**VoIP Services Certificate(.p12)**をアップロードします。これは通常の通知に使用する標準のAPNsプッシュ証明書とは異なる証明書タイプです。作成手順:
  1. Apple Developer Portalにアクセスする
  2. VoIP Services Certificateを選択する
  3. 画面の指示に従って証明書を生成してダウンロードする
  4. Keychain Accessで開き、.p12ファイルとしてエクスポートする
  5. VoIP OneSignalアプリのiOS設定に.p12ファイルをアップロードする
VoIPアプリに標準のAPNsプッシュ証明書をアップロードしないでください。間違った証明書タイプを使用すると、APIはプッシュリクエストを受け付けますが、Appleがそれを拒否し、通知が届きません。
macOSのキーチェーンアクセスに表示されたVoIP Services Certificate
OneSignalダッシュボードにアップロードされたVoIP Services Certificate
4

OneSignalにVoIPトークンを登録する

Create User APIを使用して、VoIP OneSignalアプリにVoIPトークンを登録します。
サンドボックス/開発ビルドには"test_type": 1が必要です。 このフィールドを省略すると、API呼び出しは成功してエラーも返されませんが、Appleはトークンをプロダクション用として扱い、送信されたすべてのプッシュをサイレントに拒否します。
curl --request POST \
     --url https://api.onesignal.com/apps/YOUR_VOIP_APP_ID/users \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '
{
  "subscriptions": [
    {
      "type": "iOSPush",
      "token": "YOUR_VOIP_TOKEN",
      "test_type": 1
    }
  ]
}
'
有効なVoIPトークンは64文字の小文字16進数文字列です(例:a1b2c3d4e5f6...)。PushKitはiOSシミュレーターでは動作しません — 有効なトークンを取得するには実機を使用する必要があります。
後でトークンを更新するには、Update Subscription APIを使用します。
5

VoIP通知を送信する

Create Notification APIを使用し、以下のパラメータを指定します:
  • "apns_push_type_override": "voip" — これがVoIPプッシュであることをAppleに通知する
  • app_id — VoIPアプリのID
  • include_subscription_ids — 登録したVoIPサブスクリプションID
  • contentsまたはcontent_availableのいずれかが必要
curl --include \
     --request POST \
     --header "Content-Type: application/json; charset=utf-8" \
     --header "Authorization: key YOUR_REST_API_KEY" \
     --data-binary '{
  "app_id": "YOUR_VOIP_APP_ID",
  "content_available": true,
  "data": {
    "your_custom_data": "your_custom_value"
  },
  "apns_push_type_override": "voip",
  "include_subscription_ids": ["YOUR_VOIP_SUBSCRIPTION_ID"]
}' \
https://api.onesignal.com/notifications
6

VoIPセットアップを確認する

以下の場合、iOS VoIP統合は正しく機能しています:
  1. VoIPアプリでVoIPトークンがiOSプッシュサブスクリプションとして表示される
  2. VoIPプッシュがアプリ内のpushRegistry(_:didReceiveIncomingPushWith:for:completion:)をトリガーする
  3. アプリが終了またはバックグラウンドの状態でもウェイクアップされる

Android:VoIPスタイルの動作をシミュレートする

AndroidはVoIPプッシュ通知をサポートしていません。Apple PushKitに相当するものはありません。 代わりに、Androidの通話アプリは以下を使用してVoIP動作をシミュレートします:
  • データのみのプッシュ通知
  • フォアグラウンドサービス
  • カスタム通話スタイルのUI
OneSignalの通常のAndroidプッシュサポートとネイティブのAndroid APIを組み合わせてこれを実現できます。 推奨されるアプローチ:
  • データのみの通知を送信する
  • アプリ内でそれらを処理して:
    • フォアグラウンドサービスを開始する
    • 通話UIアクティビティを起動する
    • カスタムの着信通知を表示する
通知のレンダリングをインターセプトして完全に制御したい場合は、AndroidのNotification Service Extensionを使用してください。 役立つリソース:
AndroidのセットアップはOneSignal固有のものではありません。OneSignalはプッシュペイロードを配信するだけで、アプリが通話動作を処理します。

よくある質問

確認済み配信はVoIPで機能しますか?

いいえ。確認済み配信はVoIPプッシュでは追跡されません。確認済み配信はNotification Service Extensionに依存していますが、VoIP通知ではこれがトリガーされません。 代わりに、ネイティブのiOS PushKitイベントを通じて受信を追跡します:
pushRegistry(_:didReceiveIncomingPushWith:for:completion:)
このイベントはメインアプリターゲットの一部であり、別の拡張機能は不要です。詳細については、AppleのVoIPドキュメントを参照してください。

OneSignalダッシュボードからVoIP通知を送信できますか?

いいえ。VoIP通知は"apns_push_type_override": "voip"を使用してCreate Notification API経由で送信する必要があります。ダッシュボードはこのパラメータをサポートしていません。

VoIPプッシュがサイレントに失敗するのはなぜですか?

VoIPプッシュは、OneSignal APIからのエラーなしに失敗することがあります。以下のチェックリストで確認してください:
  1. サンドボックス/開発ビルドを使用していますか? Create User APIでトークンを登録する際に"test_type": 1を含める必要があります。これを省略すると、トークンがプロダクション用として登録され、Appleがプッシュを拒否してサイレントに失敗します。
  2. 正しい証明書をアップロードしましたか? VoIP OneSignalアプリは標準のAPNsプッシュ証明書ではなく、**VoIP Services Certificate(.p12)**を使用する必要があります。Keychain Accessでは両方が似て見えますが、証明書名が「VoIP Services」で始まることを確認してください。
  3. 正しいOneSignalアプリに送信していますか? 送信リクエストのapp_idはメインのプッシュアプリではなく、VoIPアプリのものである必要があります。REST API KeyもVoIPアプリのものを使用する必要があります。
  4. VoIPトークンは有効ですか? アプリの再インストールやデバイスの復元時にトークンが失効します。トークンが64文字の小文字16進数文字列であり、最近登録されたものであることを確認してください。
  5. アプリはreportNewIncomingVoIPPushPayloadを呼び出していますか? iOS 13以降、AppleはVoIPプッシュを受信したがCallKitに通話を報告しないアプリを終了します。これはOneSignalの制限ではなく、Appleの要件です。

関連ページ

メッセージ作成API

REST APIを使用してプログラムでプッシュ通知を送信します。

確認済み配信

対応プラットフォームでプッシュ通知の配信確認を追跡します。

サービス拡張機能

Notification Service Extensionを使用して通知処理をカスタマイズします。

ユーザー作成API

OneSignal APIでユーザーとサブスクリプションを登録します。