【问题标题】:How to implement PKPaymentAuthorizationViewControllerDelegate in Xcode 9 for iOS 8 backwards compatibility?如何在 Xcode 9 中实现 PKPaymentAuthorizationViewControllerDelegate 以实现 iOS 8 向后兼容?
【发布时间】: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


    【解决方案1】:

    协议“PKPaymentAuthorizationViewControllerDelegate”需要 'paymentAuthorizationViewController(_:didSelectShippingContact:completion:)' 可在 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 的支持。

    【讨论】:

    • 感谢您为提供解决方案所做的努力。然而问题仍然存在,您在答案开头的陈述与我的陈述一样有效。 当然可以通过将整个实现类限制为 iOS 9 来解决编译问题,但这不是我的问题。
    • 我也很欣赏您的解决方案。我最初担心 Apple 错误地注释了协议方法(包括仅在 iOS 9 和更高版本中需要在 iOS 8 上支持的方法声明中可用的类型,我认为这是错误的)。
    猜你喜欢
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    相关资源
    最近更新 更多