自从苹果在 iOS 上发布 PWA 和 webpush 通知以来,我在我的应用程序中实现了它,但我遇到了一个问题。
在应用程序中,我使用Notification.permission 来了解用户是否激活了推送通知。基本上行为应该是:返回“拒绝”不显示任何内容返回“允许”不显示任何内容返回“默认”显示消息“您想激活通知吗”
但在 iOS 上,如果我同意接收通知,那么我会转到另一个页面。Notification.permission 恢复为默认值。
它不会对接收良好的通知产生影响,但总是会询问用户是否要激活它们。
ios上是否有一个周转,可以知道是否已授予权限,并且在更改页面后不会更改?
提前致谢
我想将同一组数据共享给多个客户端.我需要使用Push来自动更新他们在屏幕上的视图.
我已经阅读了问题和答案,Vaadin 7应用程序中推送的最小示例("@Push").现在我需要一个更健壮的现实例子.首先,我知道在Servlet环境中拥有一个永无止境的Thread并不是一个好主意.
而且我不希望每个用户都拥有自己的Thread,每个用户都可以自己访问数据库.单独一个线程检查数据库中的新数据似乎更合乎逻辑.找到后,该线程应将新数据发布到等待更新的所有用户的UI/Layouts.
我已经为网站构建了一项服务,可以轻松地将推送通知集成到他们的网站中,但是当前的Chrome实施还需要他们设置清单和服务工作者.
有没有办法只用一行Javascript来设置服务工作者和清单?
我在Chrome上使用网络推送通知,效果很好.但现在我想在我的通知中发送自定义消息.我可以让我的服务工作者呼叫我的网站获取内容,如https://simple-push-demo.appspot.com/所述,如果我希望每个收件人都能看到相同的消息,那么这很好.
有没有办法让收件人registration_id
或message_id
GCM返回?如果我可以获得其中任何一个并将它们包含在服务的回调中,我可以自定义响应.
此外,关于何时我们可以在GCM调用中包含有效负载的任何信息?
我正在尝试向我的服务器发送新的推送订阅,但遇到错误"未捕获(在承诺中)SyntaxError:JSON输入的意外结束"并且控制台说它在我的索引页面的第1行,显然不是这种情况.
我怀疑问题发生的函数(因为我将它注释掉时不会抛出错误)是sendSubscriptionToBackEnd(subscription)
在下面调用的函数:
function updateSubscriptionOnServer(subscription) {
const subscriptionJson = document.querySelector('.js-subscription-json');
const subscriptionDetails = document.querySelector('.js-subscription-details');
if (subscription) {
subscriptionJson.textContent = JSON.stringify(subscription);
sendSubscriptionToBackEnd(subscription);
subscriptionDetails.classList.remove('is-invisible');
} else {
subscriptionDetails.classList.add('is-invisible');
}
}
Run Code Online (Sandbox Code Playgroud)
函数本身(在上面的函数之前):
function sendSubscriptionToBackEnd(subscription) {
return fetch('/path/to/app/savesub.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(subscription)
})
.then(function(response) {
if (!response.ok) {
throw new Error('Bad status code from server.');
}
return response.json();
})
.then(function(responseData) {
if (!(responseData.data && responseData.data.success)) {
throw new Error('Bad response from server.');
}
});
}
Run Code Online (Sandbox Code Playgroud)
我尝试在fetch调用中用双引号替换单引号但产生相同的结果.
我知道应该填充JSON,因为它打印到 …
我完成了 Google 的网络推送通知教程(https://developers.google.com/web/fundamentals/getting-started/codelabs/push-notifications/),并向我的网络应用程序添加了一个 Service Worker。但是,我注意到大多数情况下通知文本都会被截断,如下例所示:
我想在 Chrome/Firefox 上显示一个具有相对较长正文(2-3 行)和可能较长标题(2-3 行)的网络推送通知。有官方支持吗?是否有一个选项不截断通知文本并显示全部内容?或者如何在被截断之前显示一定数量的行?谢谢。
firefox notifications google-chrome push-notification web-push
我目前正在开发一个网络应用程序,该应用程序将允许用户订阅推送通知。我们将把订阅存储在根据用户 ID 映射的数据库表中,当需要发送通知时,我们将查找用户的订阅并发送通知。
我一直在遵循本指南: https://developers.google.com/web/fundamentals/codelabs/push-notifications/
一切都很顺利,但有些事情就是感觉不太“正确”。
在每次页面加载时,服务工作线程都会被注册,然后检查它们是否已经订阅,然后即使它们是,它也会调用包含updateSubscriptionOnServer()
以下注释的内容:
// TODO: Send subscription to application server
Run Code Online (Sandbox Code Playgroud)
这实际上意味着每个页面加载都将尝试将相同的订阅写回数据库。显然我们会在应用程序中处理这个问题,但这似乎并不理想。
对于 Web Push API,这是预期的方法吗?
非常感谢
我正在使用 Web 应用程序,我想在其中集成 Firebase 通知,但是在设置所有要求后,我尝试使用 Firebase 通知编辑器对其进行测试,但没有出现错误并且消息状态已完成,但我也没有收到任何消息背景也不在前景中。
这是我的代码
索引.html
<script src="https://www.gstatic.com/firebasejs/4.10.1/firebase.js"></script>
<script>
// Initialize Firebase
var config = {
apiKey: "MY_API_KEY",
authDomain: "app.firebaseapp.com",
databaseURL: "https://app.firebaseio.com",
projectId: "app",
storageBucket: "app.appspot.com",
messagingSenderId: "MY_SENDER_ID"
};
firebase.initializeApp(config);
var messaging = firebase.messaging();
messaging.usePublicVapidKey("BLWwgk4yFuoNHdPDccuDnXYmhxZA8kwpWArWaE3t7njDT90-30dcWlJIhFbXxMpfXczcvtU8AvMf_F1EJg8Qy");
messaging.requestPermission().then(function(res) {
console.log('test')
messaging.getToken().then(function(res){
console.log(res)
})
})
messaging.onTokenRefresh(function() {
messaging.getToken()
.then(function(refreshedToken) {
console.log('Token refreshed.');
})
.catch(function(err) {
console.log('Unable to retrieve refreshed token ', err);
});
});
messaging.onMessage(function(payload) {
console.log("Message received. ", payload);
// ...
});
</script>
Run Code Online (Sandbox Code Playgroud)
firebase-messaging-sw.js
importScripts('https://www.gstatic.com/firebasejs/4.8.1/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/4.8.1/firebase-messaging.js');
firebase.initializeApp({
'messagingSenderId': 'MY_SENDER_ID' …
Run Code Online (Sandbox Code Playgroud) 我正在尝试让 Web Push API 与我的应用程序和 iOS 上的 Safari 配合使用。我可以在 Safari 中正常注册...但是,当尝试将请求发送到端点时,我收到 403,原因是:BadJwtToken。\n我已验证在身份验证标头中发送的令牌是有效的。另外,我用来发送推送请求的代码在 Chrome 和 Edge 上完美运行。\n其他人有经历过这种行为吗?下面的日志摘录显示了传出请求和响应。任何建议将不胜感激。
\n2023-02-23 16:32:05.882 DEBUG 17412 --- [/O dispatcher 1] org.apache.http.wire\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 : http-outgoing-0 >> "POST /QKmekz9T3h2DpblQXdmVpVJPWtR145PdK-WYRMt4zldrXBOGsnqLluGtB9PFehMfoTXASt2-8pTmnRzUB0P0XMMDgX-tWdgIvL1YptpQdI_pVB3EEsnbR0LUStq97BUMIrMG_yVI6eUYJVigQtVgq0Fcl0D8k7tt9U8WEBbLmFc HTTP/1.1[\\r][\\n]"\n2023-02-23 16:32:05.882 DEBUG 17412 --- [/O dispatcher 1] org.apache.http.wire\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 : http-outgoing-0 >> "Authorization: WebPush eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJhdWQiOiJodHRwczovL3dlYi5wdXNoLmFwcGxlLmNvbSIsImV4cCI6MTY3NzIxMzEyNSwic3ViIjoibWFpbHRvOiA8aW5mb0BtZHNnbG9iYWwuY29tPiJ9.7P42kj123WHHWk0AaRiFiIb1nTx1GaeaY3xmDWJbD3tlNQn_Rxw-jZPZOzxb1YeN7y2qWO9qoSIAg22_SwZuOQ[\\r][\\n]"\n2023-02-23 16:32:05.882 DEBUG 17412 --- [/O dispatcher 1] org.apache.http.wire\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 : http-outgoing-0 >> "Content-Encoding: aesgcm[\\r][\\n]"\n2023-02-23 16:32:05.882 DEBUG 17412 --- [/O dispatcher 1] org.apache.http.wire\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 : http-outgoing-0 >> "Encryption: salt=ski4AOi0Xc5HCo2zvuzDfg[\\r][\\n]"\n2023-02-23 16:32:05.882 DEBUG 17412 --- [/O dispatcher 1] org.apache.http.wire\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 …
Run Code Online (Sandbox Code Playgroud) java safari push-notification safari-push-notifications web-push
我正在为带有VAPID和有效负载加密的WebPush开发纯java实现(我已经为GCM和FCM实现了).然而,文档仍然是边缘的,代码样本仍然不重要.此刻,我正试图让它在Chrome中运行.尽管我使用VAPID获得了成功的订阅,当我发送Tickle或Payload推送消息时,我得到400 UnauthorizedRegistration.我的猜测是它与授权头或Crypto-Key头有关.这是我到目前为止发送的Tickle(没有有效载荷的推送通知):
URL: https://fcm.googleapis.com/fcm/send/xxxxx:xxxxxxxxxxx...
Action: POST/PUT (Both give same result)
With headers:
Authorization: Bearer URLBase64(JWT_HEAD).URLBase64(JWT_Payload).SIGN
Crypto-Key: p265ecdsa=X9.62(PublicKey)
Content-Type: "text/plain;charset=utf8"
Content-Length: 0
TTL: 120
JWT_HEAD="{\"typ\":\"JWT\",\"alg\":\"ES256\"}"
JWT_Payload={
aud: "https://fcm.googleapis.com",
exp: (System.currentTimeMillis() / 1000) + (60 * 60 * 12)),
sub: "mailto:webpush@mydomain.com"
}
SIGN = the "SHA256withECDSA" signature algorithm over: "URLBase64(JWT_HEAD).URLBase64(JWT_Payload)"
Run Code Online (Sandbox Code Playgroud)
我已经从JWT中的两个JSON中删除了空白,因为规范并不十分清楚空白使用,这似乎是最安全的事情.签名在再次将x9.62解码为ECPoint后验证,因此publicKey似乎是有效编码的.但是我一直得到回应:
<HTML><HEAD><TITLE>UnauthorizedRegistration</TITLE></HEAD><BODY BGCOLOR="#FFFFFF" TEXT="#000000"><H1>UnauthorizedRegistration</H1><H2>Error 400</H2></BODY></HTML>
Run Code Online (Sandbox Code Playgroud)
根据FCM文档,这仅在发生JSON错误时发生,但我觉得规范根本不包括WebPush.现在我已经尝试了Java加密提供程序中的构建,BC也产生了相同的结果.
一些代码片段用于澄清:
KeyGeneration:
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC", "BC");
ECGenParameterSpec spec = new ECGenParameterSpec("secp256r1");
keyGen.initialize(spec, secureRandom);
KeyPair vapidPair = keyGen.generateKeyPair();
Run Code Online (Sandbox Code Playgroud)
ECPublicKey到x9.62:
public byte[] toUncompressedPoint(ECPublicKey publicKey){
final ECPoint publicPoint …
Run Code Online (Sandbox Code Playgroud)