# Cordova VoIP 通话

Pushwoosh 使用 `pushwoosh-cordova-plugin` 支持 iOS 和 Android 的 VoIP 风格通话通知。这可以启用原生 VoIP 通话功能，包括来电 UI 和通话控制事件。

## 1. 添加并启用 VoIP 功能的 Pushwoosh Cordova 插件

安装插件并启用 VoIP 标志：

```sh
cordova plugin add pushwoosh-cordova-plugin --variable PW_VOIP_IOS_ENABLED=true --variable PW_VOIP_ANDROID_ENABLED=true
```

这会将插件配置为在 iOS 上支持 VoIP 功能。

## 2. 添加 PushwooshVoIP CocoaPod 依赖项

请确保 `PushwooshVoIP` pod 通过插件自动包含。如果需要，请在您的 `Podfile` 中手动验证：

```ruby
pod 'PushwooshVoIP'
```

> 此 pod 是支持基于 PushKit 的 VoIP 通知和系统级通话处理所必需的。

## 3. 在 Xcode 中启用 VoIP 后台模式

在 Xcode 中打开您的项目并按照以下步骤操作：

1.  前往 **Signing & Capabilities**。
2.  添加 **Background Modes** 功能。
3.  选中 **Voice over IP** 选项。

这允许您的应用在后台时接收传入的 VoIP 推送。

## 4. 配置 VoIP 应用代码（如果同时使用 VoIP 和常规推送）

如果您的应用同时使用标准推送和 VoIP 推送，您必须在 VoIP 初始化之前明确设置 VoIP 应用代码：

```javascript
pushwoosh.setVoipAppCode("XXXXX-XXXXX");
```

将 `"XXXXX-XXXXX"` 替换为您在 Pushwoosh 控制面板中分配给已启用 VoIP 功能的应用的 Pushwoosh App Code。
<Aside type="caution" title="重要提示">
- VoIP 推送的令牌将注册在 VoIP App Code 下，而常规推送令牌将注册在主 App Code 下。

- 此方法应在调用 `registerDevice()` 方法**之前**调用。
</Aside> 


## 5. 在 Android 上请求通话权限

在 Android 上，您需要请求用户授予接收通话的权限。为此，请调用 `requestCallPermission()` 方法。这应在注册设备之前完成。

```javascript
pushwoosh.requestCallPermission();
```


## 6. 初始化 VoIP 参数

调用以下方法来初始化 VoIP 功能：

```javascript
PushNotification.prototype.initializeVoIPParameters = function(supportsVideo, ringtoneSound, handleTypes, success, error) {
    if (typeof handleTypes === "function") {
        error = ringtoneSound;
        success = supportsVideo;
        handleTypes = undefined;
        ringtoneSound = undefined;
        supportsVideo = undefined;
    }

    exec(success, error, "PushNotification", "initializeVoIPParameters", [
        !!supportsVideo,
        ringtoneSound || "",
        handleTypes != null ? Number(handleTypes) : 1
    ]);
};
```

### 参数

- `supportsVideo` – `true` 或 `false`，取决于您的应用是否支持视频通话
- `ringtoneSound` – 自定义铃声文件名（例如 `"incoming.caf"`），或使用空字符串表示默认铃声
- `handleTypes` – 通话句柄类型的数字位掩码（`1` 代表电话号码，`2` 代表电子邮件等）

## 7. 可用的 VoIP 回调和方法

Cordova 插件支持以下与 VoIP 相关的方法和事件：

- `answer` – 当用户接听来电时调用
- `endCall` – 当用户结束当前通话时调用
- `hangup` – 当通话被挂断时调用
- `reject` – 当来电被拒绝时调用
- `muted` – 切换静音状态，仅限 iOS
- `held` – 切换保持状态，仅限 iOS
- `voipPushPayload` – 返回传入 VoIP 通话的推送负载
- `incomingCallSuccess` – 当系统通话 UI 成功显示时调用，仅限 iOS
- `incomingCallFailure` – 当系统通话 UI 显示失败时调用，仅限 iOS
- `speakerOn` – 打开扬声器
- `speakerOff` – 关闭扬声器
- `playDTMF` – 在通话期间播放 DTMF 音，仅限 iOS

这些可以使用 Cordova 的 `PushNotification` 对象进行挂钩，从而允许您控制和响应 VoIP 通话状态的变化。


## 相关链接

- [Pushwoosh Cordova SDK 概述](/zh/developer/pushwoosh-sdk/cross-platform-frameworks/cordova/)
- [iOS 上的 VoIP 推送通知 (Apple 文档)](https://developer.apple.com/documentation/pushkit)