Swift tvOS 应用内购买没有响应
Swift tvOS in-app purchase doesn't respond
我制作了一个 Apple TV 应用程序,但我的应用程序内购买没有响应。我不知道我做错了什么。我也没有收到任何构建错误。
我将应用内购买添加到 iTunes Connect,将授权添加到我的应用 ID 并添加了 StoreKit 框架。
我在 Apple TV 上测试了我的应用程序,但当我按下按钮购买我的应用程序内购买时,没有任何反应。
当我按下按钮以恢复应用内购买时,它确实要求使用我的 Apple ID 登录,所以我想这是可行的。
这是我用于应用内购买的class:
import Foundation
import StoreKit
class InAppPurchase : NSObject, SKProductsRequestDelegate, SKPaymentTransactionObserver {
let kInAppProductPurchasedNotification = "InAppProductPurchasedNotification"
let kInAppPurchaseFailedNotification = "InAppPurchaseFailedNotification"
let kInAppProductRestoredNotification = "InAppProductRestoredNotification"
let kInAppPurchasingErrorNotification = "InAppPurchasingErrorNotification"
class var sharedInstance : InAppPurchase {
struct Static {
static var onceToken: dispatch_once_t = 0
static var instance: InAppPurchase? = nil
}
dispatch_once(&Static.onceToken) {
Static.instance = InAppPurchase()
}
return Static.instance!
}
override init() {
super.init()
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
}
func buyProduct(product: SKProduct) {
print("Sending the Payment Request to Apple")
let payment = SKPayment(product: product)
SKPaymentQueue.defaultQueue().addPayment(payment)
}
func restoreTransactions() {
SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
}
func request(request: SKRequest, didFailWithError error: NSError) {
print("Error %@ \(error)")
NSNotificationCenter.defaultCenter().postNotificationName(kInAppPurchasingErrorNotification, object: error.description)
}
func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
print("Got the request from Apple")
let count: Int = response.products.count
if count > 0 {
_ = response.products
let validProduct: SKProduct = response.products[0]
print(validProduct.localizedTitle)
print(validProduct.localizedDescription)
print(validProduct.price)
buyProduct(validProduct);
}
else {
print("No products")
}
}
func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
print("Received Payment Transaction Response from Apple");
for transaction: AnyObject in transactions {
if let trans: SKPaymentTransaction = transaction as? SKPaymentTransaction {
switch trans.transactionState {
case .Purchased:
print("Product Purchased")
savePurchasedProductIdentifier(trans.payment.productIdentifier)
SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
NSNotificationCenter.defaultCenter().postNotificationName(kInAppProductPurchasedNotification, object: nil)
break
case .Failed:
print("Purchased Failed")
SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
NSNotificationCenter.defaultCenter().postNotificationName(kInAppPurchaseFailedNotification, object: nil)
break
case .Restored:
print("Product Restored")
savePurchasedProductIdentifier(trans.payment.productIdentifier)
SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
NSNotificationCenter.defaultCenter().postNotificationName(kInAppProductRestoredNotification, object: nil)
break
default:
break
}
}
}
}
func savePurchasedProductIdentifier(productIdentifier: String!) {
NSUserDefaults.standardUserDefaults().setObject(productIdentifier, forKey: productIdentifier)
NSUserDefaults.standardUserDefaults().synchronize()
}
func unlockProduct(productIdentifier: String!) {
if SKPaymentQueue.canMakePayments() {
let productID: NSSet = NSSet(object: productIdentifier)
let productsRequest: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set)
productsRequest.delegate = self
productsRequest.start()
print("Fetching Products")
}
else {
print("Сan't make purchases")
NSNotificationCenter.defaultCenter().postNotificationName(kInAppPurchasingErrorNotification, object: NSLocalizedString("CANT_MAKE_PURCHASES", comment: "Can't make purchases"))
}
}
func buyUnlockSeasonsPack() {
unlockProduct("Company.SeasonsPack")
}
}
</pre>
<p>这些是我的按钮的 IBAction 函数:</p>
<pre>@IBAction func getSeasonsPack(sender: UIButton) {
InAppPurchase.sharedInstance.buyUnlockSeasonsPack()
}
@IBAction func RestorePurchases(sender: UIButton) {
InAppPurchase.sharedInstance.restoreTransactions()
}
请帮帮我
您需要保留您的 productsRequest,因为它在 func unlockProduct() 结束时自动释放,并且不会触发以下回调。
声明为class级变量即可
我制作了一个 Apple TV 应用程序,但我的应用程序内购买没有响应。我不知道我做错了什么。我也没有收到任何构建错误。
我将应用内购买添加到 iTunes Connect,将授权添加到我的应用 ID 并添加了 StoreKit 框架。 我在 Apple TV 上测试了我的应用程序,但当我按下按钮购买我的应用程序内购买时,没有任何反应。 当我按下按钮以恢复应用内购买时,它确实要求使用我的 Apple ID 登录,所以我想这是可行的。
这是我用于应用内购买的class:
import Foundation
import StoreKit
class InAppPurchase : NSObject, SKProductsRequestDelegate, SKPaymentTransactionObserver {
let kInAppProductPurchasedNotification = "InAppProductPurchasedNotification"
let kInAppPurchaseFailedNotification = "InAppPurchaseFailedNotification"
let kInAppProductRestoredNotification = "InAppProductRestoredNotification"
let kInAppPurchasingErrorNotification = "InAppPurchasingErrorNotification"
class var sharedInstance : InAppPurchase {
struct Static {
static var onceToken: dispatch_once_t = 0
static var instance: InAppPurchase? = nil
}
dispatch_once(&Static.onceToken) {
Static.instance = InAppPurchase()
}
return Static.instance!
}
override init() {
super.init()
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
}
func buyProduct(product: SKProduct) {
print("Sending the Payment Request to Apple")
let payment = SKPayment(product: product)
SKPaymentQueue.defaultQueue().addPayment(payment)
}
func restoreTransactions() {
SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
}
func request(request: SKRequest, didFailWithError error: NSError) {
print("Error %@ \(error)")
NSNotificationCenter.defaultCenter().postNotificationName(kInAppPurchasingErrorNotification, object: error.description)
}
func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
print("Got the request from Apple")
let count: Int = response.products.count
if count > 0 {
_ = response.products
let validProduct: SKProduct = response.products[0]
print(validProduct.localizedTitle)
print(validProduct.localizedDescription)
print(validProduct.price)
buyProduct(validProduct);
}
else {
print("No products")
}
}
func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
print("Received Payment Transaction Response from Apple");
for transaction: AnyObject in transactions {
if let trans: SKPaymentTransaction = transaction as? SKPaymentTransaction {
switch trans.transactionState {
case .Purchased:
print("Product Purchased")
savePurchasedProductIdentifier(trans.payment.productIdentifier)
SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
NSNotificationCenter.defaultCenter().postNotificationName(kInAppProductPurchasedNotification, object: nil)
break
case .Failed:
print("Purchased Failed")
SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
NSNotificationCenter.defaultCenter().postNotificationName(kInAppPurchaseFailedNotification, object: nil)
break
case .Restored:
print("Product Restored")
savePurchasedProductIdentifier(trans.payment.productIdentifier)
SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
NSNotificationCenter.defaultCenter().postNotificationName(kInAppProductRestoredNotification, object: nil)
break
default:
break
}
}
}
}
func savePurchasedProductIdentifier(productIdentifier: String!) {
NSUserDefaults.standardUserDefaults().setObject(productIdentifier, forKey: productIdentifier)
NSUserDefaults.standardUserDefaults().synchronize()
}
func unlockProduct(productIdentifier: String!) {
if SKPaymentQueue.canMakePayments() {
let productID: NSSet = NSSet(object: productIdentifier)
let productsRequest: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set)
productsRequest.delegate = self
productsRequest.start()
print("Fetching Products")
}
else {
print("Сan't make purchases")
NSNotificationCenter.defaultCenter().postNotificationName(kInAppPurchasingErrorNotification, object: NSLocalizedString("CANT_MAKE_PURCHASES", comment: "Can't make purchases"))
}
}
func buyUnlockSeasonsPack() {
unlockProduct("Company.SeasonsPack")
}
}
</pre>
<p>这些是我的按钮的 IBAction 函数:</p>
<pre>@IBAction func getSeasonsPack(sender: UIButton) {
InAppPurchase.sharedInstance.buyUnlockSeasonsPack()
}
@IBAction func RestorePurchases(sender: UIButton) {
InAppPurchase.sharedInstance.restoreTransactions()
}
请帮帮我
您需要保留您的 productsRequest,因为它在 func unlockProduct() 结束时自动释放,并且不会触发以下回调。
声明为class级变量即可