iOS 13 Apple Pay 按钮单击引发错误:“必须从用户手势处理程序创建新的 ApplePaySession。”

Pau*_*oke 5 javascript ios knockout.js applepay

在一个已经与 Apple Pay 集成的网站上工作了大约一年,没有出现任何问题。我们注意到,现在仅适用于 iOS 13 设备。iOS 12 及以下版本均按预期工作。

前端点击处理程序:

<div class="btn btn-apple">
  <div class="apple-pay-button apple-pay-button-white" lang="en" data-bind="click: intializeApplePaySession"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

JS 点击处理程序:

self.intializeApplePaySession = function() {
  new RestClient(RestClient.POST, "/rest/model/someController", {},
    //Success
    function(data, textStatus, jqXHR) {

      var session = new ApplePaySession(3,data.applePayPaymentRequest);
      initializeCallbacks(session);
      session.begin();
    },
...
Run Code Online (Sandbox Code Playgroud)

“必须从用户手势处理程序创建一个新的 ApplePaySession。” 总是被扔到

var session = new ApplePaySession(3,data.applePayPaymentRequest);

适用于所有 iOS 13 设备。iOS 12 及更低版本可以使用相同的代码正常工作。

从我的调试中我可以看到正在处理的事件是一个 MouseEvent,这对我来说很有意义。关于为什么会抛出这个有什么想法吗?

Jas*_*son 5

我们正在逐渐不再让网站在没有用户输入的情况下进行跨源调用。

其被锁定一段时间的方法之一是您无法触发,例如,表单的提交按钮......除非您从 click() 处理程序执行此操作。因此,您可以在页面上放置一个大而闪亮的“立即购买”图像,然后通过单击该图像提交表单,但您不能只执行setTimeout(form.submit(), 100)

我想你这里也有同样的事情。REST 调用位于 click 处理程序中,但 apple pay 调用位于 REST 调用的回调中,因此并不真正位于 click() 处理程序中。

当然,您正在使用 REST 调用来生成要传递给 Apple 的数据。您可能必须推测性地生成该数据。但在进行基础设施工作之前,我会尝试一下点击处理程序的异步版本是否通过了健全性检查。