iOS 13下,Xcode11中的ApplePay PKPaymentAuthorizationViewController未显示

7
我们的应用程序已经实现了 ApplePay 年多了。最近我按下了触发按钮,结果发现从 PKPaymentAuthorizationViewController 中出现的支付表不会显示。在沙盒环境中(即模拟器或连接到 Xcode 的设备)它不会滑动上来,但是打断点后显示已成功创建。距离上次测试已经有一段时间了,但我怀疑是由于 Xcode11 或 iOS13 引起的改变。

我的代码是标准的 Apple Pay,但以下是已发布的代码。

        let item = PKPaymentSummaryItem()
        item.label = "Our Label"
        let price = NSDecimalNumber(mantissa: UInt64(totalPrice), exponent: -2, isNegative: false)
        item.amount = price

        items.append(item)

        request.paymentSummaryItems = items

        if let applePayController = PKPaymentAuthorizationViewController(paymentRequest: request) {
            applePayController.delegate = self
            present(applePayController, animated: true)
        }

1
我也遇到了同样的问题。这似乎是一个模拟器的 bug - 试着在实际设备上运行它。 - LuLuGaGa
1
不幸的是,我确实做了那件事。经过创建沙盒测试器的过程,从苹果列表中添加沙盒信用卡到设备上。但是,即使在设备上,仍然没有显示面板。在“present()”处设置断点显示它被调用了一个非空对象,但是没有任何东西出现。 - MarkPowell
我曾经遇到过类似的问题,但是我用 Objective-C 解决了它。如果您想看,我可以在下面附上代码。 - Anjula Serasinghe
派生数据已删除。断点已添加,确认当前正在调用并且applePayController不为空。 - MarkPowell
3
这是关于Xcode 11 + iOS 13的模拟器漏洞。刚刚在Xcode 11.2 beta 2上进行了测试,现在可以工作了。 - Douglas Ferreira
显示剩余2条评论
3个回答

5
这将会发生在你的PKPaymentRequest使用的商家ID未列在mobile.entitlements中,或者如果该商家ID未被你应用程序的配置文件启用。

视图控制器

  PKPaymentRequest *request = [[PKPaymentRequest alloc] init];
  
  request.merchantIdentifier = "com.your.app.merchandId"

mobile.entitlements

<dict>
    <key>com.apple.developer.in-app-payments</key>
    <array>
        <string>com.your.app.merchandId</string>
    </array>
</dict>

2
我遇到了同样的问题,Apple Pay 突然在我们的应用中停止工作。我们已经支持这个功能至少半年了。
使用最新的 Xcode(Xcode 11.2,Beta 2 (11B44)),它似乎又可以工作了。
我猜是 Xcode 的 bug。尽管它没有列在 Xcode 11.1Xcode 11.2 beta 2 的发布说明中。

1

我已将您的片段粘贴到我的应用程序中,该应用程序使用ApplePay,并在启用了ApplePay的沙盒测试设备上运行,但ApplePay按钮不起作用。

我发现这相当令人惊讶。

当您查看PKPaymentSummaryItem的文档时,它只有两个初始化程序:

init(label: String, amount: NSDecimalNumber)
init(label: String, amount: NSDecimalNumber, type:PKPaymentSummaryItemType)

这两个都没有默认值,但你正在使用空初始化器初始化一个。令人惊讶的是,没有错误或警告,甚至在代码补全中也出现了。所以我改变了初始化器:

let item = PKPaymentSummaryItem(label: "Our Label",
                                amount: NSDecimalNumber(mantissa: UInt64(totalPrice),
                                                        exponent: -2,
                                                        isNegative: false))
request.paymentSummaryItems = [items]

if let applePayController = PKPaymentAuthorizationViewController(paymentRequest: request) {
    applePayController.delegate = self
    present(applePayController, animated: true)
}

它可以运行(仅在设备上,而非模拟器)!

这让我想到了一件事,所以我只是将您的项目从let更改为var,它也可以工作。我仍然会使用文档化的初始化程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接