我的 IAP 无法正常工作。 func Paymentqueue 中的错误
Posted
技术标签:
【中文标题】我的 IAP 无法正常工作。 func Paymentqueue 中的错误【英文标题】:My IAP isn't working. Bugs at func Paymentqueue 【发布时间】:2015-11-16 17:53:37 【问题描述】:当我点击我的任何一个 IAPS 时,会出现一条消息,指出 IAP 已购买(事实并非如此)并将免费恢复,然后什么都没有发生,IAP 不会执行。
这是我在控制台中得到的:
No Value.
IAP is enabled, loading...
true
Product Request
Product Added
IAP id
Remove Ads
Removes ads from the app.
2
Buy: IAP id
Add Payment
nil
default: Error
这是我的代码:
GameViewController.Swift
import UIKit
import StoreKit
class GameViewController: UIViewController, ADBannerViewDelegate, SKProductsRequestDelegate, SKPaymentTransactionObserver, GKGameCenterControllerDelegate,GADBannerViewDelegate
@IBOutlet var outRemoveAds: UIButton!
@IBOutlet var outRestorePurchases: UIButton!
override func viewDidLoad()
super.viewDidLoad()
override func viewWillAppear(animated: Bool)
super.viewWillAppear(animated)
if NSUserDefaults.standardUserDefaults().objectForKey("val") != nil
print("Has a value.")
banner.removeFromSuperview()
bannerGoogle.removeFromSuperview()
outRemoveAds.removeFromSuperview()
outRestorePurchases.removeFromSuperview()
removeInterFrom = 1
else
print("No Value.")
if(SKPaymentQueue.canMakePayments())
print("IAP is enabled, loading...")
let productID:NSSet = NSSet(objects:"IAP id")
let request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>)
request.delegate = self
request.start()
else
print("Please enable IAPS")
//IAP Ads
@IBAction func removeAds(sender: UIButton)
for product in list
let prodID = product.productIdentifier
if (prodID == "IAP id")
p = product
buyProduct()
break
@IBAction func restorePurchases(sender: UIButton)
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
//IAP Functions
var list = [SKProduct]()
var p = SKProduct()
func removeAds()
banner.removeFromSuperview()
bannerGoogle.removeFromSuperview()
outRemoveAds.removeFromSuperview()
outRestorePurchases.removeFromSuperview()
let theValue = 10
NSUserDefaults.standardUserDefaults().setObject(theValue, forKey: "val")
NSUserDefaults.standardUserDefaults().synchronize()
func buyProduct()
print("Buy: "+p.productIdentifier)
let pay = SKPayment (product: p)
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
SKPaymentQueue.defaultQueue().addPayment(pay as SKPayment)
func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse)
print("Product Request")
let myProduct = response.products
for product in myProduct
print("Product Added")
print(product.productIdentifier)
print(product.localizedTitle)
print(product.localizedDescription)
print(product.price)
list.append(product as SKProduct)
func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction])
print("Add Payment")
for transaction:AnyObject in transactions
let trans = transaction as! SKPaymentTransaction
print(trans.error)
switch trans.transactionState
case .Purchased:
print("IAP unlocked")
print(p.productIdentifier)
let prodID = p.productIdentifier as String
switch prodID
case "IAP id":
print("Remove Ads")
removeAds()
default:
print("IAP not setup")
queue.finishTransaction(trans)
break
case .Failed:
print ("Buy error")
queue.finishTransaction(trans)
break
default:
print("default: Error")
break
func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue)
print("Purchases Restored")
_ = []
for transaction in queue.transactions
let t: SKPaymentTransaction = transaction as SKPaymentTransaction
let prodID = t.payment.productIdentifier as String
switch prodID
case "IAP id":
print("Remove Ads")
removeAds()
default:
print("IAP not setup")
func finishTransaction(trans:SKPaymentTransaction)
print("Finshed Transaction")
func paymentQueue(queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction])
print("Remove Transaction")
MenuViewController.swift
import UIKit
import StoreKit
import Social
class MenuViewController: UIViewController, SKProductsRequestDelegate,SKPaymentTransactionObserver
@IBOutlet var outRestart: UIButton!
@IBOutlet var outBuy: UIButton!
override func viewDidLoad()
super.viewDidLoad()
override func viewWillAppear(animated: Bool)
super.viewWillAppear(animated)
if(SKPaymentQueue.canMakePayments())
print("IAP is enabled, loading...")
let productID:NSSet = NSSet(objects:"IAP id")
let request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>)
request.delegate = self
request.start()
else
print("Please enable IAPS")
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
@IBAction func buy(sender: UIButton)
for product in list
let prodID = product.productIdentifier
if (prodID == "IAP id")
p = product
buyProduct()
break
//IAP Functions
var list = [SKProduct]()
var p = SKProduct()
func keepOn()
buyornot = 1
Back()
func buyProduct()
print("Buy: "+p.productIdentifier)
let pay = SKPayment (product: p)
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
SKPaymentQueue.defaultQueue().addPayment(pay as SKPayment)
func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse)
print("Product Request")
let myProduct = response.products
for product in myProduct
print("Product Added")
print(product.productIdentifier)
print(product.localizedTitle)
print(product.localizedDescription)
print(product.price)
list.append(product as SKProduct)
func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction])
print("Add Payment")
for transaction:AnyObject in transactions
let trans = transaction as! SKPaymentTransaction
print(trans.error)
switch trans.transactionState
case .Purchased:
print("IAP unlocked")
print(p.productIdentifier)
let prodID = p.productIdentifier as String
switch prodID
case "IAP id":
print("Keep on")
keepOn()
default:
print("IAP not setup")
queue.finishTransaction(trans)
break
case .Failed:
print ("Buy error")
queue.finishTransaction(trans)
break
default:
print("default: Error")
break
func finishTransaction(trans:SKPaymentTransaction)
print("Finshed Transaction")
func paymentQueue(queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction])
print("Remove Transaction")
【问题讨论】:
【参考方案1】:我找到了解决办法!
删除
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
在您拥有它的任何地方,并将其放置一次(仅一次)在每次应用启动时都会执行的位置(我将其放在 viewDidLoad() 中)。
这将检查所有未完成的交易并在应用加载后终止它们,从而在您的用户触发 IAP 之前消除任何可能的错误。
(如果这个答案或这个问题对你有帮助,别忘了点赞;))
P.S.:另外,这不是我的问题,但请确保为每个 PurchaseState 完成事务处理(),如下所示:
func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction])
print("Add Payment")
for transaction:AnyObject in transactions
let trans = transaction as! SKPaymentTransaction
print(trans.error)
switch trans.transactionState
case .Purchased:
print("IAP unlocked")
print(p.productIdentifier)
let prodID = p.productIdentifier as String
switch prodID
case "IAP id":
print("Keep on")
keepOn()
default:
print("IAP not setup")
queue.finishTransaction(trans)
break
case .Failed:
print ("Buy error")
queue.finishTransaction(trans)
break
default:
print("default: Error")
break
永远不要忘记这一点:
queue.finishTransaction(trans)
【讨论】:
以上是关于我的 IAP 无法正常工作。 func Paymentqueue 中的错误的主要内容,如果未能解决你的问题,请参考以下文章
如果有托管内容,IAP 会失败,但如果被视为正常的非消耗品,则可以正常工作