ios - 在 OpenID Microsoft 登录后,PWA 在 Safari iOS (13.5) 中的导航点击冻结
问题描述
OpenID 授权用户后 PWA 冻结 [iOS Safari Standalone]
我为我们的安全人员构建了一个简单的 PWA,它允许员工单击链接并查看有关我们公司在各种事务上的政策的内容。该应用程序使用 Microsoft 的 OWIN 中间件库来授权我们的员工通过其企业 Microsoft 登录凭据访问该应用程序。当用户单击我们登录页面上的“员工登录”提示时,他们将被重定向到 Microsoft 的域以完成登录过程。登录完成后,他们将被重定向回我们应用的主页。
问题
仅当 iOS 用户 (v13) 将应用程序固定到其主屏幕然后以独立模式启动应用程序时,并且仅在用户完全终止应用程序然后返回后才会出现此问题。我们已经在 Chrome、Safari(非独立模式)、Firefox 上测试了该应用程序,并且这些浏览器中不存在该问题。该应用程序可以无缝运行,直到用户完成 Microsoft 登录并被重定向回主页。此时,如果用户单击指向另一个页面(在应用程序内)的链接,应用程序将完全锁定,不会响应进一步的按钮单击,并且不会加载用户提示的页面。控制台中不会抛出任何错误。
我们发现,如果用户切换到另一个应用程序(即使只是一秒钟),然后当它被锁定时又切换回我们的 PWA,一切都会立即启动。此时,用户尝试导航到的页面会立即加载,无需进一步提示,并且应用程序在此之后 100% 无缝运行。它只是冻结的默认页面的初始版本。
潜在原因
我目前的工作理论是,问题是由以下一些组合引起的:
- 重定向到 Microsoft 的登录门户。当用户被发送到 Microsoft 进行身份验证,然后被发送回我们的域时,会话/cookie 连续性可能会出现问题。
- iOS的独立模式。结合上述情况,是否有可能使用第三方身份验证并短暂离开 PWA 的域会导致未来页面导航出现问题。其他浏览器或设备都没有这个问题的想法支持了这一点,我的研究表明,Apple 对 PWA 的支持仍处于早期阶段。
- 服务工作者失败。我们已经进行了大量测试,以确保在用户首次进入网站时正确安装和注册 Service Worker。我们有检查以重新注册 SW,以防万一它在页面导航中的任何位置被丢弃。我们确信,当用户在身份验证后被重定向回我们的主页时,有一个活动的服务工作者来处理页面 GET 请求。我还测试了在服务工作者注册期间显式缓存可从我们的主页访问的链接页面,以查看从缓存中提供页面是否会缓解问题。它没。这是 sw.js 中处理 fetch 请求的代码(取自 Google 的方便指南):
// "cache-first" approach for requests from client. Will try to get the file from the cache.
// If no match found, it will send the request onto the network. If both fail serve fallback page.
self.addEventListener("fetch", function (event) {
if (event.request.method !== "GET") return;
event.respondWith(
// Try the cache
caches.match(event.request).then(function (response) {
console.log("[service worker] attempting to fetch file from cache...");
return response || fetch(event.request);
}).catch(function () {
// If both fail, show a generic fallback:
return caches.match(offlineFallbackPage);
})
);
});
我已经使用 Mac 远程调试了 PWA,并且我已经验证的是,当用户单击链接以导航到新页面时触发的 click 事件得到了正确处理,因此问题确实出现在加载链接页面本身。除此之外,远程调试已确认在尝试导航到站点上的其他页面时根本没有触发 HTTP GET 错误(或任何其他错误)。
这是我构建的第一个 PWA,我是所有这些东西的新手。所以我很想知道我是否遗漏了什么或者我可以从这里去哪里。我搜索了所有论坛,似乎无法在任何地方找到答案。谢谢!
解决方案
推荐阅读
- elasticsearch - Elasticsearch 中的映射和模板有什么区别?
- ios - 添加应用程序图标时出错(apple mach-o 链接器 id 错误)
- multithreading - Pyzmq 的 eventloop.future 上下文与工作线程中的“inproc”
- sql - 在 SQL Server 中使用 groupby 进行子选择不起作用
- selenium - 如何使用 Selenium 将文件上传到 Google Drive?
- angularjs - 从赛普拉斯访问 ng-if 值
- python - 为什么是“def tokenize(文本)”?与计算文本中字符串的出现次数有关
- ruby-on-rails - 允许用户在一个表单中选择多个列表
- weka - Weka 不离散最后一列
- r - 导入 .CSV 分组并查找四分位数/IQR