Google chrome 信号器事件上的Chrome扩展推送通知
我正在构建一个chrome扩展,它可以与服务器端的外部Google chrome 信号器事件上的Chrome扩展推送通知,google-chrome,google-chrome-extension,signalr,signalr-hub,signalr.client,Google Chrome,Google Chrome Extension,Signalr,Signalr Hub,Signalr.client,我正在构建一个chrome扩展,它可以与服务器端的外部信号集线器进行通信 如果我在弹出页面中编写JS代码,我成功地将两者配置为相互通信,此方法的问题是如果扩展未打开,则无法获得更新(不响应引发的事件) 为了解决这个问题,我读到应该在background.js中编写事件处理程序,因此即使没有显示扩展弹出窗口,它仍然会响应事件。但是,我仍然需要支持在我的扩展上单击按钮来触发事件,这在读了多一点之后是不可能的,因为我无法访问后台文件中的DOM 所以我的问题是我如何解决这个问题?如何从客户端调用服务器信
信号集线器进行通信
如果我在弹出页面中编写JS代码,我成功地将两者配置为相互通信,此方法的问题是如果扩展未打开,则无法获得更新(不响应引发的事件)
为了解决这个问题,我读到应该在background.js
中编写事件处理程序,因此即使没有显示扩展弹出窗口,它仍然会响应事件。但是,我仍然需要支持在我的扩展上单击按钮来触发事件,这在读了多一点之后是不可能的,因为我无法访问后台文件中的DOM
所以我的问题是我如何解决这个问题?如何从客户端调用服务器信号器中心中的函数(或发出ajax请求)?并在弹出窗口未打开时从服务器接收响应
所谓响应,我指的是更新background.js
中的值,以及图标徽章中的值的简单+1,这将通知用户发生了什么
我对chrome扩展非常陌生,因此我非常感谢您的帮助
这是我当前的代码:
manifest.json
{
"manifest_version": 2,
"name": "Getting started ex1ample",
"description": "This extension shows a Google Image search result for the current page",
"version": "1.0",
"background": {
"scripts": ["jquery-2.1.4.min.js", "jquery.signalR-2.2.0.min.js", "background.js"],
"persistent": false
},
"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html"
},
"permissions": [
"activeTab",
"http://localhost:61275/"
]
}
background.js
var singalR = {};
$(document).ready(function(){
singalR.connection = $.hubConnection('http://localhost:61275/signalr/hubs', {useDefaultPath: false});
singalR.connection.logging = true;
singalR.roomIndexHubProxy = singalR.connection.createHubProxy('roomIndexHub');
singalR.connection.start().done(function() {
// Wire up Send button to call RoomIndexHubProxy on the server.
console.log('Hub has started');
$("#btn-join").click(function(){
singalR.roomIndexHubProxy.invoke('test', 111);
});
});
singalR.connection.error(function (error) {
console.log('SignalR error: ' + error)
});
singalR.roomIndexHubProxy.on('test', function (val) {
chrome.browserAction.setBadgeText({ text: val } );
});
});
popup.html
<!doctype html>
<html>
<head>
<script src="popup.js"></script> //empty for now
</head>
<body>
<button id="btn-join">Join</button>
</body>
</html>
//暂时空着
参加
服务器端集线器
public class RoomIndexHub : Hub
{
static int val = 0;
public RoomIndexHub(){
}
public async Task test(int k)
{
var hubContext = GlobalHost.ConnectionManager.GetHubContext<RoomIndexHub>();
val++;
await Task.Delay(4000);
hubContext.Clients.All.test(val.ToString());
}
}
公共类RoomIndexHub:Hub
{
静态int val=0;
公共RoomIndexHub(){
}
公共异步任务测试(INTK)
{
var hubContext=GlobalHost.ConnectionManager.GetHubContext();
val++;
等待任务。延迟(4000);
hubContext.Clients.All.test(val.ToString());
}
}
您是否尝试过设置背景页的生存期?将persistence设置为true,这样这个隐藏在后台的页面将一直处于“活动”状态,并且能够侦听传入的请求
“背景”:{
“脚本”:[“background.js”],
“持久”:正确
},
1。setBadgeText
现在可以工作了吗?2.你看过“简单的一次性请求”吗。不,不在这个代码中。但是,如果我将background.js代码移动到popup.js,它就会工作(除了关于在后台运行的部分)。2.是的,我只是不确定这是否是正确的方法,因为我也看到了其他选择。你认为发短信是处理这个问题的最好方式吗。我认为允许的url应该有路径组件的*
:”http://localhost:61275/*“
2。如果您可以在后台脚本1中完成所有操作,则不会。你是对的。仍然在本地以开发模式运行,所以我没有遇到错误。2.据我所知,背景仅用作脚本而不是实际页面,即使它有html页面,我也无法将其加载到弹出窗口-对吗?啊,在这种情况下是的,弹出脚本向后台脚本的侦听器发送一条消息,请求数据,后台脚本通过sendResponse
或向弹出脚本的侦听器发送一条新消息进行响应。无论如何,如果这就是问题所在,那么试着实现一些东西,如果出现问题,请将代码添加到问题中,因为我不确定在这一点上还能说些什么(我认为您可以通过谷歌搜索PopubBackground通信的示例)。