ios - 值类型未桥接到 Objective-C 错误 - 使用 SKProductsRequest 时出现运行时错误

标签 ios swift swift3 storekit

我以前能够在 iOS 应用程序中设置应用程序内购买,但是当回到项目并迁移到 Swift 3 时,我遇到运行时错误,控制台中没有错误,但我看到

Value type is not bridged to Objective-C Error

这是我请求产品时的以下功能

//Request Products
func requestProductInfo() {

    if SKPaymentQueue.canMakePayments() {

        let productIdentifiers = NSSet(array: productIDs)

        //ERROR
        let productRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set<String>)

        productRequest.delegate = self
        productRequest.start()

    }
    else {
        print("Cannot perform In App Purchases.")
    }

}

有人知道这是怎么回事吗?我知道使用 Swift Array 和 Set 和 NSSet 可能会出现一些问题,但我已经尝试改变周围的情况但仍然出现错误。

var productIDs: Array<String?> = []
var productsArray = [SKProduct]()

func transactionAction() {
    let payment = SKPayment(product: self.productsArray[self.selectedProductIndex] as SKProduct)
    SKPaymentQueue.default().add(payment)
    self.transactionInProgress = true

}

//Request Products
func requestProductInfo() {

    if SKPaymentQueue.canMakePayments() {

        let productIdentifiers = NSSet(array: productIDs)
        let productRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set<String>)

        productRequest.delegate = self
        productRequest.start()

    }
    else {
        print("Cannot perform In App Purchases.")
    }

}

func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
    if response.products.count != 0 {
      //  print("\(response.products.map {p -> String in return p.localizedTitle})")

        productsArray = response.products
    }
    else {
        print("There are no products.")
    }

    if response.invalidProductIdentifiers.count != 0 {
        print("\(response.invalidProductIdentifiers.description)")
    }

    print("Number of products in productsArray \(productsArray.count) - Number of products in productIDs \(productIDs.count)")

    setPurchaseButton()
}

最佳答案

您是否尝试过更改此行:

var productIDs: Array<String?> = []

到这个?

var productIDs: Array<String> = []

您可能需要根据此更改更改其他一些部分,但有了这个您就无需使用有风险的 as! :

        let productIdentifiers = Set(productIDs)
        let productRequest = SKProductsRequest(productIdentifiers: productIdentifiers)

如果需要通过Set<String>一个方法,你最好不要使用中间NSSet . Swift 3 最糟糕的新特性,id-as-Any,会带来灾难性的后果。

关于ios - 值类型未桥接到 Objective-C 错误 - 使用 SKProductsRequest 时出现运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39400661/

相关文章:

ios - 等待线程 Objective C 中的值发生变化

swift - 在 UIViewController 中访问自定义 UINavigationController 属性和方法

ios - Swift:如何在我的 AVPlayerLayer 顶部添加图像/文本以使其成为视频的一部分?

swift - 将记录保存到 CloudKit 不起作用

ios - 如何使用 Swift 启用 Google map 缩放控件

ios - XIB 文件消失但应用程序仍然有效

ios - 应用收据中未显示交易标识符

ios - Swift 3 NSMutableURLRequest 第二次调用失败

ios - 如何设置 UIContextualAction 的圆角半径?

ios - 带有图像的自定义后退按钮