# 自定义 Cordova 插件

## 前台推送通知

在后台接收推送时，直到用户点击推送通知前，不会触发任何事件。打开通知后，Pushwoosh 插件会触发 `push-receive` 和 `push-notification` 事件。

当在前台接收到推送时，插件会自动触发 `push-receive` 事件，并在通知中心创建一条通知。当这条通知被打开时，会触发 `push-notification` 事件。

您可以监听 `push-receive` 事件，以便在应用处于前台时立即对接收到的推送做出反应，例如更新应用当前页面的内容。另一方面，`push-notification` 用于响应通知点击事件，这需要用户交互，例如在您的应用内导航、触发新进程等。

要更改前台推送通知的外观，您可以使用 **IOS\_FOREGROUND\_ALERT\_TYPE** 和 **ANDROID\_FOREGROUND\_PUSH** 首选项：

**IOS\_FOREGROUND\_ALERT\_TYPE**

*   `NONE` – 应用在前台时不显示通知（默认）
*   `BANNER` – 显示横幅应用内提醒
*   `ALERT` – 提醒通知

**ANDROID\_FOREGROUND\_PUSH**

*   `true` – 不自动处理前台推送
*   `false` – 自动处理前台推送（默认）

示例：

```
cordova plugin add pushwoosh-cordova-plugin --variable IOS_FOREGROUND_ALERT_TYPE="ALERT" --variable ANDROID_FOREGROUND_PUSH="true"
```

## 自定义推送声音

要在 Android 上启用自定义通知声音，请将声音文件放置在 **www/res** 文件夹中，并在 `config.xml` 中指定每个声音：

```txt
<?xml version=‘1.0’ encoding=‘utf-8’?>
<widget id="YOUR_ID" version="1.0.0" xmlns="http://www.w3.org/ns/widgets” xmlns:cdv=“http://cordova.apache.org/ns/1.0">
	...
    <platform name="android">
        <allow-intent href="market:*" />
		...
        <-- Add this line for each sound -->
        <resource-file src="www/res/push.wav" target="res/raw/push.wav" />
    </platform>
</widget>
```

这些声音将在 **Send Push** 面板的 **Sound** 下拉菜单中可用。

在 iOS 上，声音文件尚未自动与 Pushwoosh 应用程序关联，但可以手动使用，例如 `www/res/sound_name.wav`。

<Aside type="caution">
#### iOS

iOS 通知仅支持 .aiff、.wav 和 .caf 文件格式。
</Aside>

## 自定义推送图标

在 Android 上，可以通过使用 `pw_notification` 作为图标的资源名称来本地自定义推送通知图标（参见示例 [1](https://github.com/Pushwoosh/pushwoosh-phonegap-cordova-sample/blob/master/Cordova/hooks/after\_platform\_add/2\_set\_notification\_icon.js) [2](https://github.com/Pushwoosh/pushwoosh-phonegap-cordova-sample/tree/master/Cordova/config/android/res)）；或者通过在 **Send Push** 面板的 **Icon** 设置中引用任何资源名称来远程自定义。

## 自定义推送数据

可以使用 **Send Push** 面板中的 **Action** 设置发送自定义推送数据。要接收和处理这些数据，请使用以下代码：

```javascript
document.addEventListener('push-notification',
  function(event) {
    var message = event.notification.message; // Push message
    var userData = event.notification.userdata; // Custom push data

    if (userData) {
      // handle custom push data here
    }
  }
);
```

## 控制日志级别

为了帮助调试和集成，SDK 默认会将所有请求打印到控制台。当您准备好进行生产构建时，请将 `LOG_LEVEL` 变量设置为以下值之一：

*   `NONE` – SDK 不输出日志
*   `ERROR` – 仅在控制台中显示错误
*   `WARNING` – 显示警告
*   `INFO` – 显示信息性消息
*   `DEBUG` – 显示所有内容，包括调试信息（默认）

示例：

```
cordova plugin add pushwoosh-cordova-plugin --variable LOG_LEVEL="INFO"
```

## 深度链接

我们推荐使用 [https://github.com/EddyVerbruggen/Custom-URL-scheme](https://github.com/EddyVerbruggen/Custom-URL-scheme)\
为 Cordova 设置深度链接非常简单，并且它能与 Pushwoosh 的深度链接功能开箱即用。

您可以在[本指南](/zh/developer/guides/messaging-channels/deep-linking/)或[插件文档](https://github.com/EddyVerbruggen/Custom-URL-scheme#2-installation)中找到安装和使用说明。

## 富媒体 JS 桥

您可以通过 javascript 接口从 Cordova WebView 中的富媒体调用您的 JS 函数。
来自富媒体的调用必须采用以下格式：

\<interface>.callFunction('\<function\_name>', \<params\_string>)

示例：

**1.** 创建一个带有 javascript 调用的富媒体：

```javascript
testBridge.callFunction('testFunction', JSON.stringify({'param1' : 1, 'param2':'test'}))
```

**2.** 将 javascript 接口添加到您的项目中：

```javascript
pushNotification.addJavaScriptInterface('testBridge');
```

**3.** 添加函数：

```javascript
function testFunction(params) {
    alert("Bridge is working! " + params.param1 + " " + params.param2);
}
```

## 将 Pushwoosh 插件与其他 FCM 服务一起使用

如果您的应用使用了其他依赖 **firebase-messaging** 的插件，可能会导致冲突，或者其中一个插件无法正常工作。要解决此冲突，您可以添加一个自定义的 FirebaseMessagingService 类，该类将在插件之间路由推送通知。Pushwoosh Cordova 插件包含此类的一个模板，您可以直接使用它来强制所有通知通过 Pushwoosh 处理程序，或者修改它以处理来自其他提供商的通知。要启用该模板，请取消插件 `plugin.xml` 中以下行的注释：

```
    <service android:name="com.pushwoosh.plugin.pushnotifications.CustomFirebaseMessagingService" android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>
```

## 与我们分享您的反馈

您的反馈有助于我们创造更好的体验，因此如果您在 SDK 集成过程中遇到任何问题，我们很乐意听取您的意见。如果您遇到任何困难，请随时[通过此表单](https://docs.google.com/forms/d/e/1FAIpQLSd\_0b8jwn-V\_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform)与我们分享您的想法。