reactjs - showNotification api 不适用于 create-react-app
问题描述
我正在使用 create-react-app v2。
我注册我serviceWorker
的index.js
:
serviceWorker.register();
在App.js
我请求通知许可时:
const requestPermission = () => {
Notification.requestPermission((status) => {
console.log('Notification permission status', status)
})
}
一旦获得用户的许可(这是有效的),我想显示一条虚拟消息(这无效)
function displayNotification() {
if (Notification.permission == 'granted') {
navigator.serviceWorker.getRegistration().then(function(reg) {
if (reg) {
console.log('navigator', navigator)
console.log('navigator.serviceWorker', navigator.serviceWorker)
console.log('reg', reg)
reg.showNotification('Hello world!');
} else {
console.log('no reg', reg)
}
})
}
}
我的应用程序/组件是独立于 CRA 的,我只是调用这两个函数:
import React from 'react';
import logo from './logo.svg';
import './App.css';
function displayNotification() {
if (Notification.permission == 'granted') {
navigator.serviceWorker.getRegistration().then(function(reg) {
if (reg) {
console.log('navigator', navigator)
console.log('navigator.serviceWorker', navigator.serviceWorker)
console.log('reg', reg)
reg.showNotification('Hello world!');
} else {
console.log('no reg', reg)
}
})
}
}
const requestPermission = () => {
Notification.requestPermission((status) => {
console.log('Notification permission status', status)
})
}
function App() {
requestPermission()
displayNotification()
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
}
export default App;
我在 heroku 上部署虚拟应用程序以避免 localhost 问题:
https://powerful-mesa-67529.herokuapp.com/
我可以看到我service-worker
的被激活了。令我惊讶的是,当我检查注册对象时,我没有看到showNotification
函数:
// navigator.serviceWorker.getRegistration().then(function(reg)
这是 reg 对象:
ServiceWorkerRegistration {scope: "https://powerful-mesa-67529.herokuapp.com/", updateViaCache: "imports", active: ServiceWorker, installing: null, navigationPreload: NavigationPreloadManager, …}
scope: "https://powerful-mesa-67529.herokuapp.com/"
updateViaCache: "imports"
active: ServiceWorker {scriptURL: "https://powerful-mesa-67529.herokuapp.com/service-worker.js", state: "activated", onerror: null, onstatechange: null}
installing: null
navigationPreload: NavigationPreloadManager {}
sync: SyncManager {}
waiting: null
onupdatefound: ƒ ()
backgroundFetch: BackgroundFetchManager {}
paymentManager: PaymentManager {instruments: PaymentInstruments, userHint: ""}
periodicSync: PeriodicSyncManager {}
pushManager: PushManager {}
__proto__: ServiceWorkerRegistration
我不确定如何调试它,因为这是一个内置 API,我没有访问权限。如果有人对此主题有经验并且可以指出为什么通知不起作用。
我的packageg.json
:
{
"name": "web-pushy",
"version": "0.1.0",
"private": true,
"dependencies": {
"@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.3.2",
"@testing-library/user-event": "^7.1.2",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-scripts": "3.4.1"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": "react-app"
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}
Web api 可以在 Google 文档中找到:
https://developers.google.com/web/ilt/pwa/introduction-to-push-notifications
解决方案
推荐阅读
- php - 警告:mkdir(): 主机中的权限被拒绝
- flutter - Flutter/Dart:自动将上传到 S3 Bucket 的图像设置为“image/jpeg”?
- sql - 如何将时间序列数据中的列作为数组返回
- python - 对于 dtype float64 的列,合并没有按预期工作
- javascript - 如何使用 Get-EventLog、Convert-ToHTML 并添加 javascript 搜索框来过滤条目?
- python - PySpark 数据帧的交叉验证(逻辑回归)给出错误:'标签不存在。可用的: ...'
- linker - 是否可以 dlopen 可执行二进制文件?
- python - 从同一索引打印
- javascript - 我已经安装了“react-scripts”:“^4.0.3”,但我仍然无法使用 Css 模块
- wordpress - wordpress dooplay 主题播放器数据未更新