加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift – 如何在Xcode 9中实现PKPaymentAuthorizationViewContro

发布时间:2020-12-14 19:05:42 所属栏目:百科 来源:网络整理
导读:我正在尝试构建一个在 Xcode 9上使用Apple Pay的应用程序.部署目标是iOS 8. 直到Xcode 8.3.3(和iOS 10 SDK),这完美地运作: extension MyViewController: PKPaymentAuthorizationViewControllerDelegate {func paymentAuthorizationViewController(_ control
我正在尝试构建一个在 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,我得到以下构建错误:

Protocol ‘PKPaymentAuthorizationViewControllerDelegate’ requires ‘paymentAuthorizationViewController(_:didSelectShippingContact:completion:)’ to be available on iOS 8.0 and newer

这意味着,我应该将@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上可用,所以现在我似乎需要实现已弃用的方法(或者我在这里错了?).

有没有人有同样的问题?有什么想法吗?我很欣赏每一个想法:)

谢谢!

解决方法

Protocol ‘PKPaymentAuthorizationViewControllerDelegate’ requires
‘paymentAuthorizationViewController(_:didSelectShippingContact:completion:)’
to be available on iOS 8.0 and newer

并不意味着该方法需要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的支持.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读