React Native локальные и удаленные уведомления для iOS и Android
Этот репозиторий активно не поддерживается. Основная причина – время. Второй, вероятно, сложность уведомлений как на 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. Вам следует следовать инструкциям по установке.
ПРИМЕЧАНИЕ. firebase-messaging
до версии 15 должен иметь один и тот же номер версии для правильной работы во время сборки и во время выполнения. Чтобы использовать конкретную версию:
В вашем 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"/> </intent-фильтр> </приемник> <serviceandroid:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationListenerService"android:exported="false" > <интент-фильтр> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-фильтр> </сервис> .....
Если не используется встроенный цвет Android ( @android:color/{name}
) для элемента meta-data
notification_color
. В android/app/src/main/res/values/colors.xml
(создайте файл, если он не существует).
<ресурсы> <color name="white">#FFF</color> </ресурсы>
Если ваше приложение имеет @Override для onNewIntent в MainActivity.java
убедитесь, что функция включает супервызов onNewIntent (если ваш MainActivity.java
не имеет @Override для onNewIntent, пропустите это):
@Overridepublic void onNewIntent (Намерение) { ...super.onNewIntent(намерение); ... }
Убедитесь, что вы правильно установили Firebase.
В android/build.gradle
сценарий сборки {... зависимости {... classpath('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 включал Firebase SDK для Google Analytics.Теперь, чтобы использовать Analytics или любой продукт Firebase, который рекомендует использовать Analytics (см. таблицу ниже), вам необходимо явно добавить зависимость 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
зависимости {... проект реализации(':реагировать-родное-push-уведомление')... }
Вручную зарегистрируйте модуль в MainApplication.java
(если вы не использовали react-native link
):
импортировать com.dieam.reactnativepushnotification.ReactNativePushNotificationPackage; // <--- Импортировать пакетpublic class MainApplication расширяет приложение реализует 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() // <---- Добавить пакет); } }; .... }
НЕ ИСПОЛЬЗУЙТЕ .configure()
ВНУТРИ КОМПОНЕНТА, ДАЖЕ App
Если вы это сделаете, обработчики уведомлений не сработают, поскольку они не загружены. Вместо этого используйте
.configure()
в первом файле приложения, обычноindex.js
.
импортировать PushNotificationIOS из «@react-native-community/push-notification-ios»; импортировать PushNotification из «реагировать-native-push-notification»; // Должен находиться за пределами жизненного цикла любого компонента (например, `comComponentDidMount`).PushNotification. настроить({ // (необязательно) Вызывается при создании токена (iOS и Android) onRegister: функция (токен) {console.log("TOKEN:", token); }, // (обязательно) Вызывается при получении или открытии удаленного сообщения или при открытии локального уведомления onNotification: function (notification) {console.log("NOTIFICATION:", Notification);//обработка уведомления// (обязательно) Вызывается при получении или открытии удаленного уведомления или при открытии локального уведомленияnotification.finish(PushNotificationIOS.FetchResult. НетДанных); }, // (необязательно) Вызывается, когда нажимается зарегистрированное действие, а значение ignoreApp ложно, если true, будет вызван onNotification (Android) onAction: function (notification) {console.log("ACTION:", Notification.action);console.log("NOTIFICATION:", Notification);// обрабатываем действие }, // (необязательно) Вызывается, когда пользователю не удается зарегистрироваться для получения удаленных уведомлений. Обычно происходит, когда у APNS возникают проблемы или если устройство является симулятором. (iOS) onRegistrationError: функция (ошибка) {console.error(err.message, err); }, // ТОЛЬКО IOS (необязательно): по умолчанию: все — разрешения на регистрацию. разрешения: {предупреждение: правда, значок: правда, звук: правда, }, // Должно ли первоначальное уведомление появиться автоматически // по умолчанию: правда popInitialNotification: правда, /** * (необязательно) по умолчанию: true * — указывается, будут ли запрошены разрешения (ios) и токен (android и ios) или нет, * — если нет, вы должны вызвать PushNotificationsHandler.requestPermissions() позже * — если нет используя удаленное уведомление или у вас не установлен Firebase, используйте это: * requestPermissions: Platform.OS === 'ios' */ requestPermissions: правда,});
Папка примеров содержит пример приложения, демонстрирующий использование этого пакета. Обработка уведомлений выполняется в NotifService.js
.
Пожалуйста, протестируйте свои PR с помощью этого примера приложения, прежде чем отправлять их. Это поможет поддерживать это репо.
Когда любое уведомление открыто или получено, обратный вызов onNotification
вызывается с передачей объекта с данными уведомления.
Пример объекта уведомления:
{foreground: false, // BOOLEAN: если уведомление было получено на переднем плане или notuserInteraction: false, // BOOLEAN: если уведомление было открыто пользователем из области уведомлений или notmessage: 'My Notification Message', // STRING: Данные уведомления: {}, // ОБЪЕКТ: push-данные или определенная информация о пользователе в локальных уведомлениях}
PushNotification.localNotification(подробности: Объект)
ПРИМЕР:
PushNotification.localNotification({ /* Свойства только для Android */ ChannelId: "your-channel-id", // (обязательный) идентификатор канала, если канал не существует, уведомление не сработает. Тикер: "Мой тикер уведомлений", // (необязательно) showWhen: true, // (необязательно) по умолчанию: true autoCancel: true, // (необязательно) по умолчанию: true bigIcon: "ic_launcher", // (необязательно) по умолчанию: "ic_launcher". Используйте «» для отсутствия большого значка. bigIconUrl: "https://www.example.tld/picture.jpg", // (необязательно) по умолчанию: не определено smallIcon: "ic_notification", // (необязательно) по умолчанию: "ic_notification" с резервным вариантом для "ic_launcher". Используйте «» для маленького значка по умолчанию. bigText: «Мой большой текст, который будет отображаться при раскрытии уведомления. Стилизацию можно выполнить с помощью HTML-тегов (подробности см. в документации Android)», // (необязательно) по умолчанию: свойство «message» подтекст: «Это подтекст», // (необязательно) по умолчанию: нет bigPictureUrl: "https://www.example.tld/picture.jpg", // (необязательно) по умолчанию: не определено bigLargeIcon: "ic_launcher", // (необязательно) по умолчанию: не определено bigLargeIconUrl: "https://www.example.tld/bigicon.jpg", // (необязательно) по умолчанию: не определено цвет: "красный", // (необязательно) по умолчанию: системное значение по умолчанию вибрация: true, // (необязательно) по умолчанию: true вибрация: 300, // длительность вибрации в миллисекундах, игнорируется, если vibrate=false, по умолчанию: 1000 tag: "some_tag", // (необязательно) добавить тег к сообщению group: "group", // (необязательно) добавить группу в сообщение groupSummary: false, // (необязательно) установить это уведомление в качестве сводки группы для группы уведомлений, по умолчанию: false текущий: false, // (необязательно) устанавливает, является ли это «текущим» уведомлением приоритет: "высокий", // (необязательно) установить приоритет уведомления, по умолчанию: высокий видимость: "частный", // (необязательно) установить видимость уведомлений, по умолчанию: частный ignoreInForeground: false, // (необязательно), если true, уведомление не будет видно, когда приложение находится на переднем плане (полезно для сравнения с тем, как появляются уведомления iOS). следует использовать в сочетании с настройкой com.dieam.reactnativepushnotification.notification_foreground. ShortcutId: "shortcut-id", // (необязательно) Если это уведомление дублирует ярлык панели запуска, устанавливает идентификатор ярлыка, в случае, если программа запуска хочет скрыть ярлык, значение по умолчанию не определено. onlyAlertOnce: false, // (необязательно) оповещение откроется только один раз со звуком и уведомлением, по умолчанию: false When: null, // (необязательно) Добавьте временную метку (значение временной метки Unix в миллисекундах), относящуюся к уведомлению (обычно время, когда произошло событие). Для приложений, ориентированных на Build.VERSION_CODES.N и более поздних версий, это время больше не отображается по умолчанию, и его необходимо включить, используя `showWhen`, по умолчанию: null. usingChronometer: false, // (необязательно) Показывать поле «когда» в качестве секундомера. Вместо представления «когда» в качестве отметки времени в уведомлении будет автоматически обновляться количество минут и секунд, прошедших с момента. Полезно при отображении прошедшего времени (например, текущего телефонного звонка). По умолчанию: false. timeoutAfter: null, // (необязательно) Указывает продолжительность в миллисекундах, по истечении которой это уведомление должно быть отменено, если оно еще не отменено, по умолчанию: null messageId: "google:message_id", // (необязательно) добавлен как `message_id` для дополнительных намерений, чтобы при открытии push-уведомления можно было найти данные, хранящиеся в модуле @react-native-firebase/messaging. действия: ["Да", "Нет"], // (только для Android). Дополнительные сведения о действиях по уведомлению см. в документе. ignoreApp: true, // (необязательно) Позволяет нажимать на действия, чтобы вернуть приложение на передний план или остаться в фоновом режиме, по умолчанию: true /* Свойства только для iOS */ категория: "", // (необязательно) по умолчанию: пустая строка subtitle: «Субтитр моего уведомления», // (необязательно) заголовок меньшего размера под заголовком уведомления /* Свойства iOS и Android */ id: 0, // (необязательно) Допустимое уникальное 32-битное целое число, указанное в виде строки. по умолчанию: автоматически сгенерированный уникальный идентификатор. title: «Заголовок моего уведомления», // (необязательно) message: «Мое сообщение с уведомлением», // (обязательно) image: "https://www.example.tld/picture.jpg", // (необязательно) Отобразить изображение с уведомлением, псевдоним `bigPictureUrl` для Android. по умолчанию: неопределенное userInfo: {}, // (необязательно) по умолчанию: {} (при использовании значения null выдается ошибка значения JSON '<null>') playSound: false, // (необязательно) по умолчанию: true soundName: "default", // (необязательно) Звук, воспроизводимый при отображении уведомления. Значение «по умолчанию» воспроизводит звук по умолчанию. Для него можно установить собственный звук, например «android.resource://com.xyz/raw/my_sound». Он найдет аудиофайл «my_sound» в каталоге «res/raw» и воспроизведет его. по умолчанию: «по умолчанию» (воспроизводится звук по умолчанию) число: 10, // (необязательно) Допустимое 32-битное целое число, указанное в виде строки. по умолчанию: нет (не может быть нулем) repeeType: "day", // (необязательно) Интервал повторения. Дополнительную информацию см. в разделе «Повторяющиеся уведомления».});
PushNotification.localNotificationSchedule (подробнее: Объект)
ПРИМЕР:
PushNotification.localNotificationSchedule({ //... Вы можете использовать все опции из localNotifications message: «Мое сообщение с уведомлением», // (обязательно) дата: новая дата(Date.now() + 60 * 1000), // через 60 секунд allowWhileIdle: false, // (необязательно) установить уведомление для работы во время сна, по умолчанию: false /* Свойства только для Android */ repeateTime: 1, // (необязательно) Приращение настроенного типа повтора. Дополнительную информацию см. в разделе «Повторяющиеся уведомления».});
PushNotification.popInitialNotification(обратный вызов)
ПРИМЕР:
PushNotification.popInitialNotification((уведомление) => { console.log('Первоначальное уведомление', уведомление);});
В Android добавьте свой собственный звуковой файл в [project_root]/android/app/src/main/res/raw
В iOS добавьте свой собственный звуковой файл в Resources
проекта в xCode.
В json уведомлении о местоположении укажите полное имя файла:
soundName: 'my_sound.mp3'
Чтобы использовать каналы, создайте их при запуске и передайте соответствующий channelId
в PushNotification.localNotification
или PushNotification.localNotificationSchedule
.
импортировать PushNotification, {Importance} из 'реагировать-native-push-notification';... PushNotification.createChannel({channelId: "channel-id", // (обязательно) ChannelName: "Мой канал", // (обязательно) ChannelDescription: «Канал для категоризации ваших уведомлений», // (необязательно) по умолчанию: не определено. playSound: false, // (необязательно) по умолчанию: true soundName: «default», // (необязательно) См. параметр soundName функции localNotification. Важность: Importance.HIGH, // (необязательно) по умолчанию: Importance.HIGH. Int значение важности уведомления Android vibrate: true, // (необязательно) по умолчанию: true. Создает шаблон вибрации по умолчанию, если true.},(created) => console.log(`createChannel return '${created}'`) // (необязательно) обратный вызов возвращает, был ли канал создан, false означает, что он уже создан существовал. );
ПРИМЕЧАНИЕ. Без канала уведомления не работают.
В параметрах уведомлений вы должны указать идентификатор канала с channelId: "your-channel-id"
Если канал не существует, уведомление может не быть запущено. После создания канал не может быть обновлен. Если вы измените эти параметры, убедитесь, что ваш channelId
отличается. Если вы создали канал другим способом, будут применены параметры канала.
Если вы хотите использовать другой канал по умолчанию для удаленного уведомления, обратитесь к документации Firebase:
Настройка клиентского приложения Firebase Cloud Messaging на Android
<метаданные 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" />
Если не определено, вернитесь к значению Firebase, определенному в AndroidManifest
:
<метаданные android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="..." />
Если не определено, откат к идентификатору канала Firebase по умолчанию fcm_fallback_notification_channel
Вы можете просмотреть доступные каналы с помощью:
PushNotification.getChannels(функция (channel_ids) { console.log(channel_ids); // ['channel_id_1']});
Вы можете проверить, существует ли канал с помощью:
PushNotification.channelExists(channel_id, функция (существует) { console.log(существует); // истина/ложь});
Проверить, заблокирован ли канал, можно с помощью:
PushNotification.channelBlocked(channel_id, функция (заблокирована) { console.log(заблокировано); // истина/ложь});
Вы можете удалить канал с помощью:
PushNotification.deleteChannel(channel_id);
Для этой операции необходим параметр id
для PushNotification.localNotification
. Предоставленный идентификатор будет затем использоваться для операции отмены.
PushNotification.localNotification({...id: '123'...});PushNotification.cancelLocalNotification('123'