swift – 如何在Xcode 9中实现PKPaymentAuthorizationViewContro
我正在尝试构建一个在
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,[PKPaymentSummaryItem]) -> Void) { // handle the PKContact on iOS 9 and later } 现在,使用Xcode 9,我得到以下构建错误:
这意味着,我应该将@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,[PKPaymentSummaryItem]) -> Swift.Void) 因此,该方法被定义为可从iOS 8开始使用. 接下来是:查看PKContact的定义(它是上述方法的方法签名的一部分),您可以看到以下内容: @available(iOS 9.0,*) open class PKContact : NSObject { ... } 因此,根据当前的SDK,该方法在iOS 8上可用(导致构建错误),但其中一个参数类型仅在iOS 9上可用.这似乎是互斥的. 我知道我试图实现的方法已被弃用,但替代版仅在iOS 11上可用,所以现在我似乎需要实现已弃用的方法(或者我在这里错了?). 有没有人有同样的问题?有什么想法吗?我很欣赏每一个想法:) 谢谢! 解决方法
并不意味着该方法需要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,[PKPaymentSummaryItem]) -> Swift.Void) { } } @available(iOS 9.0,*) class Payment: NSObject,PKPaymentAuthorizationViewControllerDelegate { func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) { } func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController,[PKPaymentSummaryItem]) -> Void) { // handle the PKContact on iOS 9 and later } } 现在您可以根据已安装的iOS使用专用类 if #available(iOS 9.0,*) { //use Payment } else { //use DeprecatedPayment } 此外,随着时间的推移,很容易放弃对已弃用的iOS的支持. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |