针对 iOS 和 Android 的 React 本机本地和远程通知
该存储库并未得到积极维护。主要原因是时间。第二个问题可能是 iOS 和 Android 上通知的复杂性。因为这个项目可能需要大量的重构来解决某些问题或实现新功能。我认为你应该考虑这些替代方案:Notifee 自九月起免费或react-native-notifications。
如果您有兴趣成为该项目的维护者,请随时提出问题。
在 CHANGELOG 中查看更改和迁移:
变更日志
欢迎维护者!请随时与我联系
从版本 3.1.3 开始,更新日志可在此处获取:更新日志
npm install --save react-native-push-notification
yarn add react-native-push-notification
注意:如果您的目标是 iOS,则还需要遵循 PushNotificationIOS 的安装说明,因为此软件包依赖于它。
注意:对于 Android,您仍然需要手动更新 AndroidManifest.xml(如下所示)才能使用计划通知。
有问题吗?在提出问题之前,请阅读故障排除指南。
请阅读...
该组件使用 PushNotificationIOS 作为 iOS 部分。您应该遵循他们的安装说明。
注意:版本 15 之前的firebase-messaging
需要具有相同的版本号,以便在构建时和运行时正常工作。要使用特定版本:
在你的android/build.gradle
中
分机{ googlePlayServicesVersion = "<您的播放服务版本>" // 默认值:"+"firebaseMessagingVersion = "<您的 Firebase 版本>" // 默认值:"21.1.0"// 其他设置compileSdkVersion = <您的编译 SDK 版本> // 默认值: 23buildToolsVersion = "<您的构建工具版本>" // 默认值:"23.0.1"targetSdkVersion = <您的目标 SDK 版本> // 默认值: 23supportLibVersion = "<您的支持库版本>" // 默认值:23.1.1}
注意:localNotification() 无需更改应用程序部分即可工作,而 localNotificationSchedule() 仅适用于这些更改:
在你的android/app/src/main/AndroidManifest.xml
中
…… <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <application ....><!-- 将值更改为 true,以在接收远程通知时在前台启用弹出窗口(为了防止在显示本地通知时重复,请将其设置为 false)--><meta-data android: name="com.dieam.reactnativepushnotification.notification_foreground"android:value="false"/><!-- 将资源名称更改为您应用程序的强调色 - 或您想要的任何其他颜色 --><meta-data android:name="com.dieam.reactnativepushnotification.notification_color"android:resource="@color/white"/> <!-- 或 @android:color/{name} 使用标准颜色 --><receiver android:名称 =“com.dieam.reactnativepushnotification.modules.RNPushNotificationActions”/> <receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationPublisher" /> <receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationBootEventReceiver"> <意图过滤器> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.QUICKBOOT_POWERON" /> <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/> </意图过滤器> </接收者> <serviceandroid:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationListenerService"android:exported="false" > <意图过滤器> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </意图过滤器> </服务> ……
如果没有为notification_color
meta-data
项使用内置 Android 颜色 ( @android:color/{name}
)。在android/app/src/main/res/values/colors.xml
中(如果该文件不存在则创建该文件)。
<资源> <颜色名称=“白色”>#FFF</颜色> </资源>
如果您的应用程序在MainActivity.java
中的 onNewIntent 上有 @Override,请确保该函数包含 onNewIntent 上的超级调用(如果您的MainActivity.java
没有 onNewIntent 的 @Override 则跳过此操作):
@Overridepublic void onNewIntent(意图意图){ ...super.onNewIntent(意图); ... }
确保您已正确安装设置 Firebase。
在android/build.gradle
中
构建脚本{... 依赖项{... 类路径('com.google.gms:google-services:4.3.3')... } }
在android/app/build.gradle
中
依赖项 { ... 实施“com.google.firebase:firebase-analytics:17.3.0” ... } 应用插件:'com.google.gms.google-services'
然后将google-services.json
放入android/app/
中。
注意:firebase/发行说明
不再需要 Firebase Android 库
firebase-core
。该 SDK 包含适用于 Google Analytics 的 Firebase SDK。现在,要使用 Analytics 或任何建议使用 Analytics 的 Firebase 产品(请参见下表),您需要显式添加 Analytics 依赖项:
com.google.firebase:firebase-analytics:17.3.0
。
在android/settings.gradle
中
... 包含 ':react-native-push-notification'project(':react-native-push-notification').projectDir = file('../node_modules/react-native-push-notification/android')
在你的android/app/build.gradle
中
依赖项{... 实施项目(':react-native-push-notification')... }
在MainApplication.java
中手动注册模块(如果您没有使用react-native link
):
导入 com.dieam.reactnativepushnotification.ReactNativePushNotificationPackage; // <--- 导入包public class MainApplication extends Application Implements ReactApplication { private Final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { @Override protected boolean getUseDeveloperSupport() {return BuildConfig.DEBUG; } } @Override protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(), new ReactNativePushNotificationPackage() // <---- 添加包 ); } }; .... }
不要在组件甚至App
内使用.configure()
如果这样做,通知处理程序将不会触发,因为它们尚未加载。相反,请在应用程序的第一个文件(通常是
index.js
)中使用.configure()
。
import PushNotificationIOS from "@react-native-community/push-notification-ios";import PushNotification from "react-native-push-notification";// 必须位于任何组件生命周期之外(例如 `componentDidMount`)。PushNotification。配置({ //(可选)生成Token时调用(iOS和Android) onRegister: function (token) {console.log("TOKEN:", token); }, // (必填) 当接收或打开远程通知,或打开本地通知时调用 onNotification: function (notification) {console.log("NOTIFICATION:", notification);// 处理通知 // (必需) 当接收或打开远程通知,或打开本地通知时调用notification.finish(PushNotificationIOS.FetchResult.无数据); }, // (可选) 当Registered Action被按下并且invokeApp为false时调用,如果为true onNotification将被调用(Android) onAction: function (notification) {console.log("ACTION:", notification.action);console.log("NOTIFICATION:", notification);// 处理操作 }, //(可选)当用户注册远程通知失败时调用。通常在 APNS 出现问题或设备是模拟器时发生。 (iOS) onRegistrationError: function(err) {console.error(err.message, err); }, // 仅限 IOS(可选):默认:全部 - 注册权限。 权限:{警报:true,徽章:true,声音:true, }, // 是否应该自动弹出初始通知 // 默认值:true 弹出初始通知:真, /** * (可选)默认值:true * - 指定是否请求权限(ios)和令牌(android 和 ios), * - 如果没有,您必须稍后调用 PushNotificationsHandler.requestPermissions() * - 如果没有使用远程通知或未安装 Firebase,请使用: * requestPermissions: Platform.OS === 'ios' */ 请求权限:true,});
示例文件夹包含一个示例应用程序来演示如何使用此包。通知处理在NotifService.js
中完成。
请在提交之前使用此示例应用程序测试您的 PR。它将有助于维护这个仓库。
当打开或接收任何通知时,将调用回调onNotification
传递带有通知数据的对象。
通知对象示例:
{foreground: false, // BOOLEAN: 是否在前台收到通知 userInteraction: false, // BOOLEAN: 通知是否由用户从通知区域打开或 notmessage: '我的通知消息', // STRING:通知messagedata: {}, // OBJECT: 推送数据或者本地通知中定义的userInfo}
PushNotification.localNotification(详细信息:对象)
例子:
PushNotification.localNotification({ /* 仅适用于 Android 的属性 */ channelId: "your-channel-id", // (必填)channelId,如果频道不存在,则不会触发通知。 ticker: "我的通知 Ticker", // (可选) showWhen: true, // (可选)默认值:true autoCancel: true, // (可选)默认值:true largeIcon: "ic_launcher", // (可选)默认值:"ic_launcher"。使用“”表示没有大图标。 largeIconUrl: "https://www.example.tld/picture.jpg", // (可选)默认值:未定义 SmallIcon: "ic_notification", // (可选)默认值:“ic_notification”,后备为“ic_launcher”。使用“”作为默认小图标。 bigText: "我的大文本将在通知展开时显示。样式可以使用 HTML 标签完成(有关详细信息,请参阅 android 文档)", // (可选)默认值: "message" 属性 subText: "这是一个子文本", // (可选)默认值:无 bigPictureUrl: "https://www.example.tld/picture.jpg", // (可选)默认值:未定义 bigLargeIcon: "ic_launcher", // (可选)默认值:未定义 bigLargeIconUrl: "https://www.example.tld/bigicon.jpg", // (可选)默认值:未定义 color: "red", // (可选)默认:系统默认 vibrate: true, // (可选)默认值:true vibrate: 300, // 振动长度(以毫秒为单位),如果 vibrate=false 则忽略,默认值:1000 tag: "some_tag", // (可选)向消息添加标签 group: "group", // (可选)将组添加到消息中 groupSummary: false, // (可选)将此通知设置为一组通知的组摘要,默认值: false 正在进行:false,//(可选)设置这是否是“正在进行”的通知 priority: "high", // (可选)设置通知优先级,默认:high visibility: "private", // (可选)设置通知可见性,默认:private ignoreInForeground: false, // (可选)如果为 true,则当应用程序位于前台时,通知将不可见(对于与 iOS 通知的显示方式保持一致很有用)。应与 com.dieam.reactnativepushnotification.notification_foreground 设置结合使用 ShortcutId: "shortcut-id", // (可选) 如果此通知与启动器快捷方式重复,则设置快捷方式的 id,以防启动器想要隐藏快捷方式,默认未定义 onlyAlertOnce: false, //(可选)警报将仅打开一次,并带有声音和通知,默认值:false when: null, // (可选)添加与通知相关的时间戳(以毫秒为单位的 Unix 时间戳值)(通常是事件发生的时间)。对于面向 Build.VERSION_CODES.N 及更高版本的应用程序,默认情况下不再显示此时间,必须使用“showWhen”选择加入,默认值:null。 useChronometer: false, // (可选)将 `when` 字段显示为秒表。通知不会将“时间”显示为时间戳,而是自动更新显示从何时开始的分钟和秒数。在显示已用时间(例如正在进行的电话呼叫)时很有用,默认值: false。 timeoutAfter: null, // (可选)指定应取消此通知的持续时间(以毫秒为单位),如果尚未取消,默认值:null messageId: "google:message_id", // (可选)作为 `message_id` 添加到意图附加中,以便打开推送通知可以找到 @react-native-firebase/messaging 模块存储的数据。 actions: ["Yes", "No"], //(仅限 Android)有关通知操作的文档以了解更多信息 invokeApp: true, // (可选)这允许单击操作将应用程序带回前台或留在后台,默认值:true /* 仅 iOS 属性 */ 类别:“”,//(可选)默认值:空字符串 subtitle: "我的通知副标题", // (可选)通知标题下方的较小标题 /* iOS 和 Android 属性 */ id: 0, //(可选)指定为字符串的有效唯一 32 位整数。默认值:自动生成的唯一 ID title: "我的通知标题", // (可选) message: "我的通知消息", // (必填) picture: "https://www.example.tld/picture.jpg", // (可选)显示带有通知的图片,Android 的别名为 `bigPictureUrl`。默认值:未定义 userInfo: {}, //(可选)默认值:{}(使用 null 会引发 JSON 值“<null>”错误) playSound: false, // (可选)默认值:true soundName: "default", // (可选)显示通知时播放的声音。 “默认”值播放默认声音。它可以设置为自定义声音,例如“android.resource://com.xyz/raw/my_sound”。它将在“res/raw”目录中查找“my_sound”音频文件并播放它。 default: 'default'(默认播放声音) number: 10, // (可选)指定为字符串的有效 32 位整数。默认值:无(不能为零) RepeatType: "day", // (可选) 重复间隔。查看“重复通知”部分以获取更多信息。});
PushNotification.localNotificationSchedule(详细信息:对象)
例子:
PushNotification.localNotificationSchedule({ //...您可以使用 localNotifications 中的所有选项 message: "我的通知消息", // (必填) date: new Date(Date.now() + 60 * 1000), // 60 秒后 allowWhileIdle: false, // (可选)设置通知在打瞌睡时工作,默认值: false /* 仅适用于 Android 的属性 */ RepeatTime: 1, //(可选)配置的repeatType的增量。查看“重复通知”部分以获取更多信息。});
PushNotification.popInitialNotification(回调)
例子:
PushNotification.popInitialNotification((通知) => { console.log('初始通知', notification);});
在 android 中,将自定义声音文件添加到[project_root]/android/app/src/main/res/raw
在 iOS 中,将自定义声音文件添加到 xCode 中的项目Resources
中。
在位置通知 json 中指定完整文件名:
soundName: 'my_sound.mp3'
要使用通道,请在启动时创建它们并将匹配的channelId
传递给PushNotification.localNotification
或PushNotification.localNotificationSchedule
。
import PushNotification, {Importance} from 'react-native-push-notification';... PushNotification.createChannel({ channelId: "channel-id", // (必填) channelName: "我的频道", // (必填) channelDescription: "对通知进行分类的频道", // (可选) 默认值: undefined playSound: false, // (可选) 默认值: true soundName: "default", // (可选) 请参阅`localNotification` 函数的 `soundName` 参数 important: Importance.HIGH, // (可选) 默认值: Android 通知重要性的 Int 值 vibrate: true, // (可选) 默认值: true 创建默认振动。 pattern if true.},(created) => console.log(`createChannel returned '${created}'`) // (可选)回调返回通道是否已创建, false 表示通道已存在。 );
注意:如果没有频道,通知将不起作用
在通知选项中,您必须提供频道 ID,其中channelId: "your-channel-id"
,如果频道不存在,则可能不会触发通知。频道一旦创建,就无法更新。如果更改这些选项,请确保您的channelId
不同。如果您以其他方式创建频道,它将应用该频道的选项。
如果您想使用不同的默认通道进行远程通知,请参阅Firebase的文档:
在 Android 上设置 Firebase Cloud Messaging 客户端应用
<元数据 android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/default_notification_channel_id" />
对于本地通知,可以使用相同类型的选项:
你可以使用:
<元数据 android:name="com.dieam.reactnativepushnotification.default_notification_channel_id" android:value="@string/default_notification_channel_id" />
如果未定义,则回退到AndroidManifest
中定义的 Firebase 值:
<元数据 android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="..." />
如果未定义,则回退到默认 Firebase 通道 ID fcm_fallback_notification_channel
您可以通过以下方式列出可用频道:
PushNotification.getChannels(函数(channel_ids) { 控制台.log(channel_ids); // ['channel_id_1']});
您可以通过以下方式检查通道是否存在:
PushNotification.channelExists(channel_id, 函数(存在) { 控制台.log(存在); // 真/假});
您可以通过以下方式检查频道是否被阻止:
PushNotification.channelBlocked(channel_id, function (blocked) { console.log(被阻止); // 真/假});
您可以使用以下命令删除频道:
PushNotification.deleteChannel(channel_id);
此操作需要PushNotification.localNotification
的id
参数。提供的 ID 将用于取消操作。
PushNotification.localNotification({...id: '123'...});PushNotification.cancelLocalNotification('123'