igo*_*udi 5 single-page-application reactjs react-router service-worker progressive-web-apps
我有一个 SPA PWA React 应用程序。
它在移动设备(Android+Chrome)上以独立模式安装和运行。
假设该应用程序列出了人员,然后当您单击某个人时,它会使用/person路线显示详细信息。
现在,我从服务器发送推送通知,并在附加到应用程序的服务工作人员中接收它们。该通知与一个人有关,我想在用户单击该通知时打开该人的详细信息。
问题是:
/person从 Service Worker 激活我的应用程序上的路线据我了解,从服务工作者notificationclick事件处理程序中我可以:
/person不是物理路线,无论哪种方式 - 我想避免刷新页面)回答我自己的问题:我使用 IndexedDB (不能使用 localStorage,因为它是同步的)在 SW 和 PWA 之间进行通信,尽管我对此不太满意。
我的服务工作人员代码大致如下(我正在使用 idb 库):
self.addEventListener('notificationclick', function(event) {
const notif = event.notification;
notif.close();
if (notif.data) {
let db;
let p = idb.openDB('my-store', 1, {
upgrade(db) {
db.createObjectStore(OBJSTORENAME, {
keyPath: 'id'
});
}
}).then(function(idb) {
db = idb;
return db.clear(OBJSTORENAME);
}).then(function(rv) {
return db.put(OBJSTORENAME, notif.data);
}).then(function(res) {
clients.openWindow('/');
}).catch(function(err) {
console.log("Error spawning notif", err);
});
event.waitUntil(p);
}
});
Run Code Online (Sandbox Code Playgroud)
然后,在我的 React 应用程序的根目录中,即在我的 AppNavBar 组件中,我总是检查是否有要显示的内容:
componentWillMount() {
let self = this;
let db;
idb.openDB('my-store', 1)
.then(function (idb) {
db = idb;
return db.getAll(OBJSTORENAME);
}).then(function (items) {
if (items && items.length) {
axios.get(`/some-additional-info-optional/${items[0].id}`).then(res => {
if (res.data && res.data.success) {
self.props.history.push({
pathname: '/details',
state: {
selectedObject: res.data.data[0]
}
});
}
});
db.clear(OBJSTORENAME)
.then()
.catch(err => {
console.log("error clearing ", OBJSTORENAME);
});
}
}).catch(function (err) {
console.log("Error", err);
});
}
Run Code Online (Sandbox Code Playgroud)
一直在玩弄clients.openWindow('/?id=123');和clients.openWindow('/#123');但它的行为很奇怪,有时应用程序会停止,所以我恢复到 IndexedDB 方法。(clients.postMessage 也可能是一种方法,尽管我不确定如何将其插入到反应框架中)
HTH 其他人,我仍在寻找更好的解决方案。
| 归档时间: |
|
| 查看次数: |
1594 次 |
| 最近记录: |