javascript - Apple Pay 界面在移动 Safari 上重定向后冻结页面
问题描述
我们正在使用 Stripe (Stripe.js / Payment Request Button)在 Safari 中实现 Apple Pay。一切都按计划进行,直到token
当我们调用ev.complete('success')时,stripe 发出事件,这会关闭 Safari Apple Pay 界面。
paymentRequest.on('token', async (ev) => {
if (ev) {
ev.complete('success');
let address = await somePromise(),
fullname = (ev.payerName || '').split(' '),
customerInfo = ...
...
let params = {...address, ..customerInfo, ...};
window.location.href = this.resolveRedirectUrl(params); // If we wrap this in setTimeout 1000ms+, issue gets fixes...
return;
}
window.location.href = this.resolveRedirectUrl()
});
它在 12.1.x iOS Safari 上运行良好,但在 12.3.x 上失败。Safari 支付界面不会自动离开屏幕(不会被关闭),当手动关闭时,会冻结我们重定向到的整个页面。只有在重新打开 Safari 时,页面才开始正常运行。
但是,如果大约一window.location.href = this.resolveRedirectUrl(params);
秒钟setTimeout
以上,问题就会得到修复。如果在完全关闭之前更改了路线,则其类似于 Apple Pay 界面不会正确关闭其 UI 元素。
界面完全关闭时是否会触发任何事件?我浏览了官方文档,但无济于事。
setTimeout
只是感觉很糟糕,次优,这种方法的里程可能会因手机性能等而异......
所以,请停下来!:)
解决方案
这听起来更像是 Safari、您的异步代码和设置之间的问题,而window.location.href
不是 Stripe 或 Apple Pay 的问题。setTimeout
确实看起来很hacky,但是WebKit内部有一些限制可以防止window.location.href
Apple Pay表打开时进行设置。更糟糕的是,在测试中,您似乎需要 3-5 秒的时间让 Safari 中的所有内容在重定向之前“稳定”下来。像这样的东西应该可以工作:
setTimeout(() => window.location.href = …, 3000)
对不起,我在这里没有更好的答案。
推荐阅读
- php - 无法使用 symfony 进程从 laravel 运行 python 脚本(退出代码:-1073740791(未知错误))
- jquery - $.parseJSON 错误:JSON 数据的第 1 行第 1 列出现意外字符
- python - 捕获 Argparse 错误并将其传递给 Discord 客户端
- c - 在一个节点中有多个元素的 B 树中递归地找到第 k 个最小的元素
- excel - Excel VBA:无法对重叠选择使用命令
- playframework-2.6 - 在 builds.sbt 和 plugins.sbt 中添加解析器的区别
- java - Spring如何仅通过形式参数名称匹配查询参数?
- php - 从另一个函数调用 PHP 函数
- ios - UIImagePickerController 在 iOS 11 上因“[UIViewController _setCameraOverlayView:]: unrecognized selector”而崩溃
- angular - 无法在角度 6 中编译 @Injectable