我试图捕获通过Chrome扩展程序发送到我的Chrome浏览器的推送通知,然后将其写入文件或在接收文件时运行代码。 我确定我所拥有的问题对你们中的一些人来说非常简单,所以我将分享我迄今为止发现的以及我的代码。
notifhook.js
(function() {
// save the original function
var origCreateNotif = notifications.createNotification;
// overwrite createNotification with a new function
notifications.createNotification = function(img, title, body) {
// call the original notification function
var result = origCreateNotif.apply(this, arguments);
alert("Function was called");
// bind a listener for when the notification is displayed
result.addEventListener("display", function() {
alert("Triggered code");
// do something when the notification is displayed
});
return result;
}
})()
的manifest.json
{
"name": "Push",
"description": "Relay push notifications",
"version": "3.0",
"permissions": ["notifications"],
"web_accessible_resources": ["notifhook.js"],
"content_scripts" : [{
"run_at" : "document_start",
"matches" : ["<all_urls>"],
"js" : ["inject.js"]
}],
"manifest_version": 2
}
inject.js
var s = document.createElement("script");
s.src = chrome.extension.getURL("notifhook.js");
document.documentElement.appendChild(s);
这里使用的大多数代码都是在这里: How can I listen to notifications?
我正在使用此webapp来测试我的扩展程序: http://ttsvetko.github.io/HTML5-Desktop-Notifications/
所以,据我所知,到目前为止发生的事情是包含我的主要功能的块正被添加到网页中 因为我可以在它开始时和每个页面加载时发出警报,它将被触发。
失败的是当我收到推送通知时,事件监听器不起作用或我的函数名称错误。我在某处读到了webkitNotifications只被#39;通知&#39;替换。
非常感谢任何帮助。
答案 0 :(得分:0)
如果代码在服务工作者中,就像当您关闭应用程序的浏览器选项卡/窗口时有通知(例如在Facebook上),那么您需要覆盖服务工作者的注册。
// taken from https://googlechrome.github.io/samples/service-worker/post-message/index.html
function sendMessage(message) {
return new Promise(function(resolve, reject) {
var messageChannel = new MessageChannel();
messageChannel.port1.onmessage = function(event) {
if (event.data.error) {
reject(event.data.error);
} else {
resolve(event.data);
}
};
navigator.serviceWorker.controller.postMessage(message,
[messageChannel.port2]);
});
}
(function() {
if ('serviceWorker' in navigator) {
var register = navigator.serviceWorker.register;
navigator.serviceWorker.register = function() {
register.call(navigator.serviceWorker, "yourscript.js").then(function() {
sendMessage({args: [].slice.call(arguments)});
});
};
}
})();
并且在service worker(yourscript.js)中,您需要使用从帖子消息中获取的原始脚本调用importScript
// put content of notifhook.js file here
self.addEventListener('message', function handler(event) {
if (event.data && event.data.args && event.data.args.length) {
importScripts(event.data.args[0]); // import original script
self.removeEventListener('message', handler);
}
});