试图解决在这篇文章中提到的问题: https://philna.sh/blog/2018/10/23/service-workers-beware-safaris-range-request/这里: PWA -缓存的视频将不会在手机上玩Safari浏览器(11.4)
问题的根源在于,我们无法显示在Safari浏览器的视频。 文章说,对这个问题的修复,但似乎导致Chrome上的另一个问题。 在我们的解决方案的区别是,我们没有使用缓存。 目前,我们只是想通过我们的服务人员的要求。 实施看起来是这样的:
self.addEventListener('fetch', function (event){
if (event.request.cache === 'only-if-cached' && event.request.mode !== 'same-origin') {
return;
}
if (event.request.headers.get('range')) {
event.respondWith(returnRangeRequest(event.request));
} else {
event.respondWith(fetch(event.request));
}
});
function returnRangeRequest(request) {
return fetch(request)
.then(res => {
return res.arrayBuffer();
})
.then(function(arrayBuffer) {
var bytes = /^bytes\=(\d+)\-(\d+)?$/g.exec(
request.headers.get('range')
);
if (bytes) {
var start = Number(bytes[1]);
var end = Number(bytes[2]) || arrayBuffer.byteLength - 1;
return new Response(arrayBuffer.slice(start, end + 1), {
status: 206,
statusText: 'Partial Content',
headers: [
['Content-Range', `bytes ${start}-${end}/${arrayBuffer.byteLength}`]
]
});
} else {
return new Response(null, {
status: 416,
statusText: 'Range Not Satisfiable',
headers: [['Content-Range', `*/${arrayBuffer.byteLength}`]]
});
}
});
}
我们得到的范围请求获取返回数组缓冲区,但它具有零byteLength并显示为空。 的范围内报头实际上包含“字节= 0-”和随后的请求具有一个起始值,但没有端值。
也许有一些特征检测,我们可以做,以确定它的Chrome,我们只需调用定期取? 我宁愿有,虽然作品无处不在的解决方案。 此外RES是显示类型:“不透明”所以也许有什么关系呢? 不知道如何看下一步该怎么。 如果我们解决不了的问题,为Chrome我可能需要为Safari浏览器不同的解决方案。