如何正确请求IAP价格
How right to request IAP price
我用一个 class 来购买和下载书籍。
在 viewWillAppear 中,我请求产品的本地化价格以在 UILabel 中显示它:
class Books: UIViewController, ... {
override func viewWillAppear(animated: Bool) {
requestProductInfo()
}
func requestProductInfo() {
if SKPaymentQueue.canMakePayments() {
var productIdentifiers: NSSet = NSSet(object: "com.jauzee.myProduct")
var productRequest = SKProductsRequest(productIdentifiers: productIdentifiers as Set<NSObject>)
productRequest.delegate = self
productRequest.start()
}
}
}
问题是:如果我关闭 Books VC 并且 requestProductInfo() 正在进行中,应用程序崩溃(有错误,我无法阅读)。
如何在请求产品信息时确保关闭图书 VC 安全?
我一直在尝试做一个特殊的帮手-class来索取产品信息:
import Foundation
import StoreKit
class InAppHelper: NSObject, SKProductsRequestDelegate {
func requestProductPrice() {
if SKPaymentQueue.canMakePayments() {
var productIdentifiers: NSSet = NSSet(object: "com.jauzee.myProduct")
var productRequest = SKProductsRequest(productIdentifiers: productIdentifiers as Set<NSObject>)
productRequest.delegate = self
productRequest.start()
}
}
func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
var products: NSArray = response.products
var count : Int = response.products.count
if count > 0 {
var product: SKProduct = products[0] as! SKProduct
userDefaults.setObject(product.localizedPrice(), forKey: "localizedPrice");
}
}
}
但是当我从图书中调用 requestProductPrice() 时 VC:
class Books: UIViewController, ... {
override func viewWillAppear(animated: Bool) {
...
var inAppHelper = InAppHelper()
inAppHelper.requestProductPrice()
...
}
}
它不调用 didReceieveResponse 委托方法。
如何正确请求应用内购买产品信息?或者如何让 class 请求该信息?
更新:
我尝试:
deinit {
SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
productRequest?.delegate = nil
productRequest?.cancel()
}
在书籍 VC 中,但没有帮助。这是否意味着问题出在其他地方(不是在 dealloc VC 中,而是在其他地方...)?或者我没有这样做正确的方式(deinit)?
在您的第一个示例中,当您离开 Books 视图控制器时,它会被释放。您还没有停止产品请求,更重要的是,还没有取消设置您分配给产品请求的委托。当请求完成时,它会尝试调用您现在已解除分配的 Books 视图控制器。这就是应用程序崩溃的原因。
要解决此问题,您需要保留对请求的引用,以便在 Books 视图控制器消失之前将委托设置为 nil。
我过去在这种情况下通常做的是在应用程序生命周期的早期分配一个帮助程序实例。助手请求所有 IAP 产品的启动时间。由于它从未被释放,因此它充当请求委托。您可以通过只读 属性 将产品提供给您的图书视图控制器。由于它从未被释放,因此您不会遇到第一个示例中出现的崩溃问题。长寿命助手实例的另一个优点是,当视图控制器想要显示它时,您通常会拥有所有产品信息。显示 IAP 列表时不会有延迟(您已经拥有它们)并且您不需要在视图控制器上实现 -didReceiveResponse
委托(正如您在第二个示例中尝试做的那样) .
我用一个 class 来购买和下载书籍。 在 viewWillAppear 中,我请求产品的本地化价格以在 UILabel 中显示它:
class Books: UIViewController, ... {
override func viewWillAppear(animated: Bool) {
requestProductInfo()
}
func requestProductInfo() {
if SKPaymentQueue.canMakePayments() {
var productIdentifiers: NSSet = NSSet(object: "com.jauzee.myProduct")
var productRequest = SKProductsRequest(productIdentifiers: productIdentifiers as Set<NSObject>)
productRequest.delegate = self
productRequest.start()
}
}
}
问题是:如果我关闭 Books VC 并且 requestProductInfo() 正在进行中,应用程序崩溃(有错误,我无法阅读)。
如何在请求产品信息时确保关闭图书 VC 安全?
我一直在尝试做一个特殊的帮手-class来索取产品信息:
import Foundation
import StoreKit
class InAppHelper: NSObject, SKProductsRequestDelegate {
func requestProductPrice() {
if SKPaymentQueue.canMakePayments() {
var productIdentifiers: NSSet = NSSet(object: "com.jauzee.myProduct")
var productRequest = SKProductsRequest(productIdentifiers: productIdentifiers as Set<NSObject>)
productRequest.delegate = self
productRequest.start()
}
}
func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
var products: NSArray = response.products
var count : Int = response.products.count
if count > 0 {
var product: SKProduct = products[0] as! SKProduct
userDefaults.setObject(product.localizedPrice(), forKey: "localizedPrice");
}
}
}
但是当我从图书中调用 requestProductPrice() 时 VC:
class Books: UIViewController, ... {
override func viewWillAppear(animated: Bool) {
...
var inAppHelper = InAppHelper()
inAppHelper.requestProductPrice()
...
}
}
它不调用 didReceieveResponse 委托方法。
如何正确请求应用内购买产品信息?或者如何让 class 请求该信息?
更新: 我尝试:
deinit {
SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
productRequest?.delegate = nil
productRequest?.cancel()
}
在书籍 VC 中,但没有帮助。这是否意味着问题出在其他地方(不是在 dealloc VC 中,而是在其他地方...)?或者我没有这样做正确的方式(deinit)?
在您的第一个示例中,当您离开 Books 视图控制器时,它会被释放。您还没有停止产品请求,更重要的是,还没有取消设置您分配给产品请求的委托。当请求完成时,它会尝试调用您现在已解除分配的 Books 视图控制器。这就是应用程序崩溃的原因。
要解决此问题,您需要保留对请求的引用,以便在 Books 视图控制器消失之前将委托设置为 nil。
我过去在这种情况下通常做的是在应用程序生命周期的早期分配一个帮助程序实例。助手请求所有 IAP 产品的启动时间。由于它从未被释放,因此它充当请求委托。您可以通过只读 属性 将产品提供给您的图书视图控制器。由于它从未被释放,因此您不会遇到第一个示例中出现的崩溃问题。长寿命助手实例的另一个优点是,当视图控制器想要显示它时,您通常会拥有所有产品信息。显示 IAP 列表时不会有延迟(您已经拥有它们)并且您不需要在视图控制器上实现 -didReceiveResponse
委托(正如您在第二个示例中尝试做的那样) .