Плагин Firebase Corodva в настоящее время показывает push-уведомление, даже когда уведомление было получено, будучи приложением на переднем плане, но это проблема и не должно быть поведением по умолчанию.Как вы можете видеть в этой проблеме, до слияния исправление можно исправить локально следующим образом:
Я изменил
PROJECT_ROOT/plugins/cordova-plugin-firebase/src/ios/AppDelegate+FirebasePlugin.m
, но также
PROJECT_ROOT/platforms/ios/PROJECT_NAME/plugins/cordova-plugin-firebase/AppDelegate+FirebasePlugin.m
В обоих файлах в строке 183 я заменил
completionHandler(UNNotificationPresentationOptionAlert);
на
completionHandler(UNNotificationPresentationOptionNone);
Теперь он ведет себя как ожидалось (без уведомлений на переднем плане, только в фоновом режиме)
После исправления вы можете использовать data.tap
и должен работать правильно:
if (data.tap) {
// when user tapped the background notification
this.pushRedirection(data);
console.log("Received in background-data", data);
}
Если вам нужно сделать это в среде CI / CD или вы просто хотите автоматизировать ее, вы можете создать Cordova Hook .
Для этого сначала создайте новую папку cordova-hooks
в src
, а затем создайте новый js-файл с именем fix_push-notifications-foreground_issue.js
, например:
src
|- ...
|- cordova-hooks
|- fix_push-notifications-foreground_issue.js
|- node_modules
|- ...
Обратите внимание, что есть и другие способы.чтобы добавить хуки Cordova (например, используя папку по умолчанию hooks
), но я все же предпочитаю использовать пользовательскую папку.Дополнительную информацию можно найти здесь .
Вставьте следующий код в этот новый файл js:
#!/usr/bin/env node
module.exports = function (context) {
const fs = require('fs');
const path = require('path');
const issue = `completionHandler(UNNotificationPresentationOptionAlert);`;
const fix = `completionHandler(UNNotificationPresentationOptionNone);`;
// ISSUE: iOS: Push notifications are shown when in foreground
// https://github.com/arnesson/cordova-plugin-firebase/issues/817
function start() {
console.log('+------------------------------------+');
console.log('| Starting PN Foreground Fix Hook |');
console.log('+------------------------------------+');
const pluginDir = path.join(context.opts.projectRoot, '/plugins/cordova-plugin-firebase-lib/src/ios');
const pluginFile = path.join(pluginDir, 'AppDelegate+FirebasePlugin.m');
const platformPluginDir = path.join(context.opts.projectRoot, '/platforms/ios/Bilbayt/Plugins/cordova-plugin-firebase-lib');
const platformPluginFile = path.join(platformPluginDir, 'AppDelegate+FirebasePlugin.m');
applyFixToFile(pluginFile);
applyFixToFile(platformPluginFile);
console.log('+------------------------------------+');
}
/**
* Fixes the push notification foreground issue on the file sent as parametner
* @param {*} file Path of the file to be fixed
*/
function applyFixToFile(file) {
if (fs.existsSync(file)) {
let content = fs.readFileSync(file).toString('utf8');
if (content.indexOf(issue) > -1) {
content = content.replace(issue, fix);
fs.writeFileSync(file, content);
console.log(` PN foregorund fix applied to ${file} file`);
} else {
console.log(` No need to apply PN foreground fix to ${file} file`);
}
} else {
console.log(` Unable to find ${file} file`);
}
}
// Start the hook
start();
}
И, наконец, добавьте хукв вашем config.xml
файле:
<widget ...
<hook src="cordova-hooks/fix_push-notifications-foreground_issue.js" type="before_prepare" />
<platform name="android">
...
</platform>
<platform name="ios">
...
</platform>
</widget>
Теперь каждый раз, когда вы создаете приложение, исправление должно применяться автоматически:)