我正在尝试构建一个在XCode 9上使用Apple Pay的应用。部署目标是iOS8。
直到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 :)
这意味着我应该将@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上可用,因此目前看来我无论如何都需要实施不推荐的方法(或者我在这里误解了吗?)。p>有人有同样的问题吗?对此有什么想法吗?我感谢每个想法:)
谢谢!
协议" PKPaymentAuthorizationViewControllerDelegate" 'paymentauthorizationViewController(_:didSelectShippingContact:完成:)' 可在iOS 8.0和更新的
上使用
并不意味着方法需要iOS 8.0和更新。这意味着该方法是在课堂上发布的,什么应该支持iOS 8.0。您可以通过将@available(iOS 9.0, *)
放在类声明
@available(iOS 9.0, *)
class MyViewController: UIViewController, PKPaymentAuthorizationViewControllerDelegate {
//...
}
错误将消失
但是如何处理您的问题。创建两个类将发布PKPaymentAuthorizationViewControllerDelegate
协议的内容。其中一个应该发布iOS 8支持,另一个支持 - iOS 9和新的。
class DeprecatedPayment: NSObject, PKPaymentAuthorizationViewControllerDelegate {
func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) {
}
func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didSelectShippingAddress address: AddressBook.ABRecord, completion: @escaping (PKPaymentAuthorizationStatus, [PKShippingMethod], [PKPaymentSummaryItem]) -> Swift.Void) {
}
}
@available(iOS 9.0, *)
class Payment: NSObject, PKPaymentAuthorizationViewControllerDelegate {
func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) {
}
func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didSelectShippingContact contact: PKContact, completion: @escaping (PKPaymentAuthorizationStatus, [PKShippingMethod], [PKPaymentSummaryItem]) -> Void) {
// handle the PKContact on iOS 9 and later
}
}
现在您可以根据安装的iOS
使用适当类if #available(iOS 9.0, *) {
//use Payment
} else {
//use DeprecatedPayment
}
时间也很容易在时间到来时放弃ios的支持。