标签: web-push

iOS 上的 PWA:Notification.permission 返回默认值,无论我们选择什么

自从苹果在 iOS 上发布 PWA 和 webpush 通知以来,我在我的应用程序中实现了它,但我遇到了一个问题。

在应用程序中,我使用Notification.permission 来了解用户是否激活了推送通知。基本上行为应该是:返回“拒绝”不显示任何内容返回“允许”不显示任何内容返回“默认”显示消息“您想激活通知吗”

但在 iOS 上,如果我同意接收通知,那么我会转到另一个页面。Notification.permission 恢复为默认值。

它不会对接收良好的通知产生影响,但总是会询问用户是否要激活它们。

ios上是否有一个周转,可以知道是否已授予权限,并且在更改页面后不会更改?

提前致谢

push-notification ios web-push progressive-web-apps

5
推荐指数
0
解决办法
873
查看次数

使用Push in Vaadin 7 app在多个客户端上显示相同的数据

我想将同一组数据共享给多个客户端.我需要使用Push来自动更新他们在屏幕上的视图.

我已经阅读了问题和答案,Vaadin 7应用程序中推送的最小示例("@Push").现在我需要一个更健壮的现实例子.首先,我知道在Servlet环境中拥有一个永无止境的Thread并不是一个好主意.

而且我不希望每个用户都拥有自己的Thread,每个用户都可以自己访问数据库.单独一个线程检查数据库中的新数据似乎更合乎逻辑.找到后,该线程应将新数据发布到等待更新的所有用户的UI/Layouts.

java vaadin vaadin7 web-push

4
推荐指数
1
解决办法
3396
查看次数

如何使用单个Javascript标记安装服务工作者和清单?

我已经为网站构建了一项服务,可以轻松地将推送通知集成到他们的网站中,但是当前的Chrome实施还需要他们设置清单和服务工作者.

有没有办法只用一行Javascript来设置服务工作者和清单?

javascript google-chrome service-worker web-push push-api

4
推荐指数
1
解决办法
1939
查看次数

使用Web推送通知从GCM获取自定义消息

我在Chrome上使用网络推送通知,效果很好.但现在我想在我的通知中发送自定义消息.我可以让我的服务工作者呼叫我的网站获取内容,如https://simple-push-demo.appspot.com/所述,如果我希望每个收件人都能看到相同的消息,那么这很好.

有没有办法让收件人registration_idmessage_idGCM返回?如果我可以获得其中任何一个并将它们包含在服务的回调中,我可以自定义响应.

此外,关于何时我们可以在GCM调用中包含有效负载的任何信息?

web-push push-api progressive-web-apps

4
推荐指数
1
解决办法
403
查看次数

未捕获(在promise中)SyntaxError:JSON输入的意外结束

我正在尝试向我的服务器发送新的推送订阅,但遇到错误"未捕获(在承诺中)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,因为它打印到 …

javascript json web-push

4
推荐指数
2
解决办法
3万
查看次数

在 Chrome/Firefox 上显示带有长标题/正文/文本的 Web 推送通知而不被截断

我完成了 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

4
推荐指数
1
解决办法
2052
查看次数

真的有必要在每次页面加载时更新订阅吗?

我目前正在开发一个网络应用程序,该应用程序将允许用户订阅推送通知。我们将把订阅存储在根据用户 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,这是预期的方法吗?

非常感谢

push-notification web-push push-api

4
推荐指数
1
解决办法
1548
查看次数

未收到 Fire-base 网络通知但没有错误

我正在使用 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)

firebase web-push firebase-cloud-messaging

4
推荐指数
1
解决办法
3367
查看次数

从 Java 向 Safari 发送推送通知

我正在尝试让 Web Push API 与我的应用程序和 iOS 上的 Safari 配合使用。我可以在 Safari 中正常注册...但是,当尝试将请求发送到端点时,我收到 403,原因是:BadJwtToken。\n我已验证在身份验证标头中发送的令牌是有效的。另外,我用来发送推送请求的代码在 Chrome 和 Edge 上完美运行。\n其他人有经历过这种行为吗?下面的日志摘录显示了传出请求和响应。任何建议将不胜感激。

\n
2023-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

4
推荐指数
1
解决办法
1184
查看次数

[WebPush] [VAPID]请求失败,400 UnauthorizedRegistration

我正在为带有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)

java google-chrome web-push vapid

3
推荐指数
1
解决办法
1792
查看次数