如何在iOS 8向后兼容的Xcode 9中实现PKPaymentAuthorizationViewControllerD



我正在尝试构建一个在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的支持。

相关内容

  • 没有找到相关文章