iOS ApplePay PKPaymentAuthorizationViewController 未出现在 Xcode11/iOS 13 中

Posted

技术标签:

【中文标题】iOS ApplePay PKPaymentAuthorizationViewController 未出现在 Xcode11/iOS 13 中【英文标题】:iOS ApplePay PKPaymentAuthorizationViewController not appearing in Xcode11/iOS 13 【发布时间】:2019-10-25 17:57:23 【问题描述】:

我们的应用程序已实施 ApplePay 多年。就在最近,我按下按钮触发它,只发现PKPaymentAuthorizationViewController 的工资单没有出现。它不会在沙箱(即连接到 Xcode 的模拟器或设备)环境中向上滑动,但放置断点表明它正在成功创建。我已经有一段时间没有测试过了,但我怀疑 Xcode11 或 ios 13 会发生一些变化。

我的代码是非常标准的 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)
        

【问题讨论】:

我遇到了同样的问题。这似乎是一个模拟器错误 - 尝试在实际设备上运行它。 不幸的是,我确实这样做了。完成了创建沙盒测试器的过程,将沙盒信用卡添加到 Apple 列表中的设备。但是,即使在设备上也没有显示面板。在“present()”处放置断点表明它被一个非零对象调用,但没有出现。 我遇到了同样的问题,但我在目标 c- 中做到了,如果你想看到我可以附在下面 尝试清除您的派生数据文件夹并重建您的应用程序,看看是否有帮助。在 present(applePayController, animated: true) 之前设置断点以查看它是否被调用或删除打印语句以查看它是否被调用。 这是 Xcode 11 + iOS 13 上的模拟器错误。刚刚在 Xcode 11.2 beta 2 上测试过,现在可以正常工作了???? 【参考方案1】:

我遇到了同样的问题,Apple Pay 突然停止在我们的应用中运行。我们也已经支持它至少半年了。

使用最新的 Xcode(Xcode 11.2,Beta 2 (11B44)),它似乎又可以工作了。

我猜那是一个 Xcode 错误。即使它没有在 Xcode 的 Xcode 11.1 或 Xcode 11.2 beta 2 的发行说明中列出。

【讨论】:

【参考方案2】:

我已将您的 sn-p 粘贴到我的应用程序中,该应用程序使用 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,它也能正常工作。我仍然会使用记录在案的初始化程序。

【讨论】:

【参考方案3】:

如果您的 PKPaymentRequest 使用的商家 ID 未在 mobile.entitlements 中列出,则会发生这种情况。或者,如果您的应用的配置文件未启用 MerchantID。

视图控制器

  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>

【讨论】:

以上是关于iOS ApplePay PKPaymentAuthorizationViewController 未出现在 Xcode11/iOS 13 中的主要内容,如果未能解决你的问题,请参考以下文章

沙盒环境中的 iOS ApplePay

iOS ApplePay PKPaymentAuthorizationViewController 未出现在 Xcode11/iOS 13 中

ApplePay

如何验证 ios 设备是不是支持 Apple Pay

Apple Pay - 支付后端服务器 - iOS

有关支付的相关知识学习ApplePay和支付宝