> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# VoIPプッシュ通知

> OneSignalを使用してiOSでVoIPプッシュ通知を送信する方法を説明します。PushKitによるトークン登録とVoIP証明書の設定、およびAndroidでの通話スタイルの動作の代替手段について解説します。

VoIPプッシュ通知を使用すると、アプリがバックグラウンドや終了状態でも着信アラートを受信できます。AppleはVoIPプッシュを標準のプッシュ通知とは異なる方法で処理します。別の証明書タイプ、別のトークン（PushKit経由）、異なる配信ルールが使用されます。

OneSignalはVoIPプッシュの**送信**をサポートしていますが、OneSignal SDKはVoIPトークンの登録を**処理しません**。以下はお客様の責任となります：

* Apple PushKitを使用してアプリでVoIPトークンを登録する
* VoIP Services Certificateを使用した専用のOneSignalアプリを作成する
* OneSignal REST APIを通じてトークンを登録し、プッシュを送信する

### プラットフォームの違い

| プラットフォーム    | VoIPプッシュのサポート | 動作方法                               |
| ----------- | ------------- | ---------------------------------- |
| **iOS**     | Yes           | Apple PushKitとVoIP APNs証明書を使用      |
| **Android** | No            | 通話スタイルの動作をシミュレートするためにデータのみのプッシュを使用 |

クロスプラットフォームの通話アプリを構築している場合、プラットフォームごとに異なるアプローチを使用することになります。

***

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

iOSでは、VoIP通知はApple PushKitを使用し、標準のプッシュ通知とは異なる特別な配信ルールに従います。AppleがVoIPプッシュを異なる方法で処理するため、OneSignalはVoIP用に別個のアプリ構成を必要とします。

<Warning>
  **開始する前に** — VoIPセットアップで最もよくある間違いを挙げます：

  1. **VoIP用に別個のOneSignalアプリを作成していない。** AppleはVoIPに異なる証明書タイプを要求するため、OneSignalはVoIPプッシュを送信するための専用アプリを必要とします。既存のプッシュアプリを両方に使用することはできません。
  2. **間違った証明書をアップロードしている。** 標準のAPNsプッシュ証明書ではなく、\*\*VoIP Services Certificate（.p12）\*\*が必要です。間違ったものを使用すると、サイレントな配信失敗が発生します。
  3. **サンドボックスで`test_type`を忘れている。** 開発ビルドでテストする場合、トークンを登録するときに`"test_type": 1`を含める必要があります。これを省略すると、API呼び出しは成功しますが、プッシュが届きません。
</Warning>

<Steps>
  <Step title="PushKitを使用してVoIPトークンを登録する">
    AppleのPushKitフレームワークを使用してVoIP通知に登録し、VoIPトークンを受け取ります。

    * アプリにPushKitを実装する
    * AppleがローテーションするときにVoIPトークンを保存して更新する
    * AppleのVoIPポリシーに厳密に従う

    <Accordion title="例：PushKitデリゲートの実装">
      ```swift theme={null}
      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を参照
          }
      }
      ```

      <Note>これは標準のApple PushKitコードです。OneSignalはPushKit SDKを提供していません — トークンをご自身で登録し、ステップ4でOneSignalに渡します。</Note>
    </Accordion>

    Appleのリソース：

    * [PushKitドキュメント](https://developer.apple.com/documentation/pushkit)
    * [VoIPプッシュへの応答](https://developer.apple.com/documentation/pushkit/responding_to_voip_notifications_from_pushkit)
    * [AppleのVoIPベストプラクティス](https://developer.apple.com/library/content/documentation/Performance/Conceptual/EnergyGuide-iOS/OptimizeVoIP.html)
  </Step>

  <Step title="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プッシュを送信するためにサーバーサイドのみで使用されます。

    <Note>Bundle ID（例：`com.yourcompany.appname`）は、Xcodeのターゲットの**General**タブで確認できます。</Note>
  </Step>

  <Step title="VoIP Services Certificateをアップロードする">
    VoIP OneSignalアプリで、\*\*VoIP Services Certificate（.p12）\*\*をアップロードします。これは通常の通知に使用する標準のAPNsプッシュ証明書とは異なる証明書タイプです。

    作成手順：

    1. [Apple Developer Portal](https://developer.apple.com/account/resources/certificates/add)にアクセスする
    2. **VoIP Services Certificate**を選択する
    3. 画面の指示に従って証明書を生成してダウンロードする
    4. Keychain Accessで開き、`.p12`ファイルとしてエクスポートする
    5. VoIP OneSignalアプリのiOS設定に`.p12`ファイルをアップロードする

    <Warning>
      VoIPアプリに標準のAPNsプッシュ証明書をアップロード**しないでください**。間違った証明書タイプを使用すると、APIはプッシュリクエストを受け付けますが、Appleがそれを拒否し、通知が届きません。
    </Warning>

    <Frame caption="キーチェーンアクセス内のVoIP証明書">
      <img src="https://mintcdn.com/onesignal/jFWn5xzleD8du3j6/images/docs/6101554-Screen_Shot_2020-04-26_at_1.07.52_PM.png?fit=max&auto=format&n=jFWn5xzleD8du3j6&q=85&s=5d19f1262fdf67d5185ed8d8b4743493" alt="macOSのキーチェーンアクセスに表示されたVoIP Services Certificate" width="1868" height="1624" data-path="images/docs/6101554-Screen_Shot_2020-04-26_at_1.07.52_PM.png" />
    </Frame>

    <Frame caption="OneSignalダッシュボードにアップロードされたVoIP証明書">
      <img src="https://mintcdn.com/onesignal/0qspEXXeJ8zJbkJ-/images/docs/81a2fea-a2a2e71-Screenshot_2024-02-23_at_1.32.08_PM.png?fit=max&auto=format&n=0qspEXXeJ8zJbkJ-&q=85&s=6ee92a10fc3473c644880fa7517eb46b" alt="OneSignalダッシュボードにアップロードされたVoIP Services Certificate" width="466" height="130" data-path="images/docs/81a2fea-a2a2e71-Screenshot_2024-02-23_at_1.32.08_PM.png" />
    </Frame>
  </Step>

  <Step title="OneSignalにVoIPトークンを登録する">
    [Create User](/reference/create-user) APIを使用して、VoIP OneSignalアプリにVoIPトークンを登録します。

    <Warning>
      **サンドボックス/開発ビルドには`"test_type": 1`が必要です。** このフィールドを省略すると、API呼び出しは成功してエラーも返されませんが、Appleはトークンをプロダクション用として扱い、送信されたすべてのプッシュをサイレントに拒否します。
    </Warning>

    ```curl theme={null}
    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
        }
      ]
    }
    '
    ```

    <Note>有効なVoIPトークンは64文字の小文字16進数文字列です（例：`a1b2c3d4e5f6...`）。PushKitはiOSシミュレーターでは動作しません — 有効なトークンを取得するには実機を使用する必要があります。</Note>

    後でトークンを更新するには、[Update Subscription](/reference/update-subscription) APIを使用します。
  </Step>

  <Step title="VoIP通知を送信する">
    [Create Notification](/reference/create-message) APIを使用し、以下のパラメータを指定します：

    * `"apns_push_type_override": "voip"` — これがVoIPプッシュであることをAppleに通知する
    * `app_id` — VoIPアプリのID
    * `include_subscription_ids` — 登録したVoIPサブスクリプションID
    * `contents`または`content_available`のいずれかが必要

    ```curl theme={null}
    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
    ```
  </Step>

  <Step title="VoIPセットアップを確認する">
    以下の場合、iOS VoIP統合は正しく機能しています：

    1. **VoIPアプリ**でVoIPトークンがiOSプッシュサブスクリプションとして表示される
    2. VoIPプッシュがアプリ内の[`pushRegistry(_:didReceiveIncomingPushWith:for:completion:)`](https://developer.apple.com/documentation/pushkit/responding_to_voip_notifications_from_pushkit)をトリガーする
    3. アプリが終了またはバックグラウンドの状態でもウェイクアップされる
  </Step>
</Steps>

***

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

AndroidはVoIPプッシュ通知をサポートしていません。Apple PushKitに相当するものはありません。

代わりに、Androidの通話アプリは以下を使用してVoIP動作をシミュレートします：

* データのみのプッシュ通知
* フォアグラウンドサービス
* カスタム通話スタイルのUI

OneSignalの通常のAndroidプッシュサポートとネイティブのAndroid APIを組み合わせてこれを実現できます。

**推奨されるアプローチ：**

* データのみの通知を送信する
* アプリ内でそれらを処理して：
  * フォアグラウンドサービスを開始する
  * 通話UIアクティビティを起動する
  * カスタムの着信通知を表示する

通知のレンダリングをインターセプトして完全に制御したい場合は、Androidの[Notification Service Extension](./service-extensions#notification-service-extension)を使用してください。

**役立つリソース：**

* [Android通話アプリガイド](https://developer.android.com/guide/topics/connectivity/telecom/selfManaged)
* [着信UIの例](https://medium.com/@dcostalloyd90/show-incoming-voip-call-notification-and-open-activity-for-android-os-10-5aada2d4c1e4)

<Info>Androidのセットアップは**OneSignal固有のものではありません**。OneSignalはプッシュペイロードを配信するだけで、アプリが通話動作を処理します。</Info>

***

## よくある質問

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

いいえ。[確認済み配信](./confirmed-delivery)はVoIPプッシュでは**追跡されません**。確認済み配信はNotification Service Extensionに依存していますが、VoIP通知ではこれがトリガーされません。

代わりに、ネイティブのiOS PushKitイベントを通じて受信を追跡します：

```swift theme={null}
pushRegistry(_:didReceiveIncomingPushWith:for:completion:)
```

このイベントはメインアプリターゲットの一部であり、別の拡張機能は不要です。詳細については、[AppleのVoIPドキュメント](https://developer.apple.com/documentation/pushkit/responding_to_voip_notifications_from_pushkit#3377587)を参照してください。

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

いいえ。VoIP通知は`"apns_push_type_override": "voip"`を使用して[Create Notification](/reference/create-message) 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の要件です。

***

## 関連ページ

<Columns cols={2}>
  <Card title="メッセージ作成API" icon="code" href="/reference/create-message">
    REST APIを使用してプログラムでプッシュ通知を送信します。
  </Card>

  <Card title="確認済み配信" icon="circle-check" href="./confirmed-delivery">
    対応プラットフォームでプッシュ通知の配信確認を追跡します。
  </Card>

  <Card title="サービス拡張機能" icon="puzzle-piece" href="./service-extensions">
    Notification Service Extensionを使用して通知処理をカスタマイズします。
  </Card>

  <Card title="ユーザー作成API" icon="user-plus" href="/reference/create-user">
    OneSignal APIでユーザーとサブスクリプションを登録します。
  </Card>
</Columns>
