【发布时间】:2018-03-07 09:20:45
【问题描述】:
我正在尝试在 Xcode 9 上构建一个使用 Apple Pay 的应用。部署目标是 iOS 8。
在 Xcode 8.3.3(和 iOS 10 SDK)之前,它运行良好:
extension MyViewController: PKPaymentAuthorizationViewControllerDelegate {
func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didSelectShippingAddress address: ABRecord, completion: @escaping (PKPaymentAuthorizationStatus, [PKShippingMethod], [PKPaymentSummaryItem]) -> Void) {
// handle the ABRecord for iOS 8
}
@available(iOS 9.0, *)
func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didSelectShippingContact contact: PKContact, completion: @escaping (PKPaymentAuthorizationStatus, [PKShippingMethod], [PKPaymentSummaryItem]) -> Void) {
// handle the PKContact on iOS 9 and later
}
现在,使用 Xcode 9 我得到以下构建错误:
协议“PKPaymentAuthorizationViewControllerDelegate”要求“paymentAuthorizationViewController(_:didSelectShippingContact:completion:)”在 iOS 8.0 及更高版本上可用
这意味着,我应该将@available(iOS 9, *) 更改为@available(iOS 8, *)。
查看PKPaymentAuthorizationViewControllerDelegate 的定义,我看到以下内容:
@available(iOS, introduced: 8.0, deprecated: 11.0, message: "Use paymentAuthorizationViewController:didSelectShippingContact:handler: instead to provide more granular errors")
optional public func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didSelectShippingContact contact: PKContact, completion: @escaping (PKPaymentAuthorizationStatus, [PKShippingMethod], [PKPaymentSummaryItem]) -> Swift.Void)
因此,该方法被定义为可从 iOS 8 开始使用。
问题来了:查看PKContact 的定义(这是上述方法的方法签名的一部分),您可以看到以下内容:
@available(iOS 9.0, *)
open class PKContact : NSObject {
...
}
所以,根据当前的 SDK,该方法在 iOS 8 上可用(这会导致构建错误),但其中一种参数类型仅在 iOS 9 上可用。这似乎是互斥的。
我知道我尝试实施的方法已被弃用,但替换仅在 iOS 11 上可用,所以现在看来我无论如何都需要实施弃用的方法(或者我在这里弄错了吗?)。
有人有同样的问题吗?对此有什么想法吗?我感谢每一个想法:)
谢谢!
【问题讨论】:
标签: swift xcode xcode9 applepay passkit