问题描述
在 android chrome 中不会触发 service worker 同步 我错过了什么??? 同样的事情在这里:JavaScript Background Sync Stops Working if Page is Loaded/Refreshed while offline
- 拔下 USB 电缆进行开发(用于 chrome 开发工具)
- 按下安卓主页按钮
- 按下电源按钮进入睡眠状态(黑屏)
- 然后我等待 5 分钟(至少)
- 然后我按下电源按钮唤醒
- 然后我将 myapp 推送到唤醒应用程序(应用程序未关闭但设置为睡眠)
- 然后我插入 USB 电缆进行调试
- 然后我单击某个按钮以启动同步,然后我看到 ---
在控制台“REGISTER”但“SYNC”事件未触发 如果我再次单击电源按钮(黑屏) 然后我再次单击电源按钮 - 然后它会醒来 或者我关闭wifi然后打开wifi - 然后它会醒来
然后在控制台“注册”和“同步”中看到
客户端JS
var id = 'background-sync-' + (new Date()).getTime() + $.uniqid(6);
let postData = {
'type': 'background-sync','uuid': id,};
registration.active.postMessage(postData);
服务人员方面
self.addEventListener('message',function (event) {
//console.log('message=' + event.data.type);
if (event.data.type === 'background-sync') {
registerSync(event.data.uuid,event.data);
}
});
self.addEventListener('sync',function (event) {
console.log('SYNC');
//event.waitUntil(syncIt(event.tag));
});
function registerSync(uuid,data) {
if (data != undefined && data != null) {
let id = data.id;
//append data to storage
syncStore[id] = data;
//this is important
syncStore[id]['sending'] = false;
}
console.log('REGISTER');
//console.log(data);
//console.log(self.registration.sync.getTags());
self.registration.sync.register(uuid)
.then(function () {
})
.catch(function (err) {
return err;
});
}
解决方法
没有解决办法。甚至后台定期同步也不起作用。 所以我已经解决了 - 如果可能,发送常规帖子并使用 background.sync 作为离线数据同步。 问题是如果我单击电源按钮一次然后同步请求设置为等待 如果第二次,则同步请求将发送到服务器。
解决方案代码:
if( this.online ){
let self = this;
$.post(self.requestUrl,self.params,function (returnData) {
if( callback )
callback(returnData);
}).fail(function () {
window.backgroundSync(self.requestUrl,callback,self.storeData);
});
}
else {
window.backgroundSync(this.requestUrl,this.params,this.storeData);
}