应用程序内购买 – 如何在Swift中使用Xcode 7和SpriteKit修复iOS
我在
Swift中使用Xcode 7和SpriteKit制作了一个游戏,然后我完成了它.在我将其提交给iTunes Connect之后,Apple拒绝了它并且他们给我发了一条消息,他们说问题出在Restore Purchase上,但是我把它放在购买的同一个按钮中,所以我创建了一个具有两个功能的按钮:
?1.进行购买, ?2.恢复购买. 当我测试它时,它完美地工作,当用户必须恢复购买时,他们不再付费.我不知道Apple是否可以接受.或者如果我忘了放些东西,请检查我的代码! 消息是:
我使用的代码是: override func viewDidLoad() { super.viewDidLoad() func addTransactionObserver() { SKPaymentQueue.defaultQueue().addTransactionObserver(self) } func removeTransactionObserver() { SKPaymentQueue.defaultQueue().removeTransactionObserver(self) } } @IBAction func removeAds(sender: UIButton) { print("Remove Ads Button pressed") for product in list { let prodID = product.productIdentifier if(prodID == "Squares.RemoveAds") { p = product buyProduct() break; } } ////SKPaymentQueue.defaultQueue().addTransactionObserver(self) SKPaymentQueue.defaultQueue().restoreCompletedTransactions() } override func prefersStatusBarHidden() -> Bool { return true } //Remove Ads Payment var list = [SKProduct]() var p = SKProduct() //Squares.RemoveAds 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) } removeAdsButton.enabled = true removeAdsIPhone6Plus.enabled = true } func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) { print("Transactions Restored") var purchasedItemIDS = [] for transaction in queue.transactions { let t: SKPaymentTransaction = transaction as SKPaymentTransaction let prodID = t.payment.productIdentifier as String switch prodID { case ProductID.removeAds: print("Remove Ads") Ads.removeAllAds() case ProductID.removeAds: print("Remove Ads for iPhone 6 Plus") Ads.removeAllAds() default: print("IAP not setup") } } } 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("Buy,Ok unlock Squares here") print(p.productIdentifier) let prodID = p.productIdentifier as String switch prodID { case ProductID.removeAds: print("Remove Ads") Ads.removeAllAds() case ProductID.removeAds: print("Remove Ads for iPhone 6 Plus") Ads.removeAllAds() default: print("IAP not Setup") } queue.finishTransaction(trans) break; case .Failed: print("Buy Error") queue.finishTransaction(trans) break; default: print("Default") break; } } } func finishTransaction(trans:SKPaymentTransaction){ print("Finish Transaction") } func paymentQueue(queue: SKPaymentQueue,removedTransactions transactions: [SKPaymentTransaction]) { print("Remove Transaction") } } 我希望你的贡献对我有所帮助. 解决方法
您可能只需要在屏幕上放置一个按钮供用户按下,然后将其连接到@IBAction func RestorePurchases
我已经为Xcode 7.0,iOS 9.0和Swift 2.0添加了我的默认IAP,使用正确的字符串更改“com.dname.YourApp.removeAds”:) // // IAPViewController.swift // import UIKit import StoreKit class IAPViewController: UIViewController,SKProductsRequestDelegate,SKPaymentTransactionObserver{ let userDefaults = NSUserDefaults.standardUserDefaults() //@IBOutlet var lblAd: UILabel! // @IBOutlet var lblCoinAmount: UILabel! @IBOutlet var removeAds: UIButton! //@IBOutlet var outAddCoins: UIButton! //var coins = 50 // 1 override func viewDidLoad() { super.viewDidLoad() removeAds.enabled = false // outAddCoins.enabled = false // Set IAPS if(SKPaymentQueue.canMakePayments()) { print("IAP is enabled,loading") let productID:NSSet = NSSet(objects: "com.dname.YourApp.removeAds") let request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>) request.delegate = self request.start() } else { print("please enable IAPS") } } // 2 @IBAction func btnRemoveAds(sender: UIButton) { for product in list { let prodID = product.productIdentifier if(prodID == "com.dname.YourApp.removeAds") { p = product buyProduct() break; } } } /* // 3 @IBAction func btnAddCoins(sender: UIButton) { for product in list { var prodID = product.productIdentifier if(prodID == "com.dname.YourApp.addcoins") { p = product buyProduct() break; } } } */ /* // 4 func removeAds() { lblAd.removeFromSuperview() } */ /* // 5 func addCoins() { coins = coins + 50 lblCoinAmount.text = "(coins)" } */ override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func RestorePurchases(sender: UIButton) { SKPaymentQueue.defaultQueue().addTransactionObserver(self) SKPaymentQueue.defaultQueue().restoreCompletedTransactions() } var list = [SKProduct]() var p = SKProduct() 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) //println(product.price) list.append(product ) } removeAds.enabled = true //outAddCoins.enabled = true } func buyProduct() { print("buy " + p.productIdentifier) let pay = SKPayment(product: p) SKPaymentQueue.defaultQueue().addTransactionObserver(self) SKPaymentQueue.defaultQueue().addPayment(pay as SKPayment) } func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) { print("transactions restored") // var purchasedItemIDS = [] for transaction in queue.transactions { let t: SKPaymentTransaction = transaction let prodID = t.payment.productIdentifier as String switch prodID { case "com.dname.YourApp.removeAds": //Set the user default to not show ads userDefaults.setObject(1,forKey: "noAds") userDefaults.synchronize() print("remove ads") //removeAds() case "com.dname.YourApp.addcoins": print("add coins to account") //addCoins() default: print("IAP not setup") } } } func paymentQueue(queue: SKPaymentQueue,updatedTransactions transactions: [SKPaymentTransaction]) { print("add paymnet") for transaction:AnyObject in transactions { let trans = transaction as! SKPaymentTransaction print(trans.error) switch trans.transactionState { case .Purchased: print("buy,ok unlock iap here") print(p.productIdentifier) let prodID = p.productIdentifier as String switch prodID { case "com.dname.YourApp.removeAds": print("remove ads") //Set the user default to not show ads userDefaults.setObject(1,forKey: "noAds") userDefaults.synchronize() //removeAds()`enter code here` case "com.dname.YourApp.addcoins": print("add coins to account") //addCoins() default: print("IAP not setup") } queue.finishTransaction(trans) break; case .Failed: print("buy error") queue.finishTransaction(trans) break; default: print("default") break; } } } func finishTransaction(trans:SKPaymentTransaction) { print("finish trans") SKPaymentQueue.defaultQueue().finishTransaction(trans) } func paymentQueue(queue: SKPaymentQueue,removedTransactions transactions: [SKPaymentTransaction]) { print("Remove Transaction") } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |