針對 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:name=" 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 protectedBeatlean getUseDeveloperSupport(ConfUG);Config. } @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`ation)。配置({ //(可選)產生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} 從 'react-native-push-notification';... PushNotification.createChannel({ channelId: "channel-id", // (必填) channelName: "我的頻道", // (必填) channelDescription: "對通知進行分類的頻道", // (可選) 預設值: undefined. playSound: false, // (可選) 預設值: true soundName: "default", // (可選) 請參閱`soundName` 參數localNotification` 函數important: Importance.HIGH, // (可選) 預設值: Android 通知重要性的Int 值vibrate: true, // (可選) 預設值: true 如果為true,則建立預設振動模式。 );
注意:如果沒有頻道,通知將不起作用
在通知選項中,您必須提供頻道 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'