hallo zusammen,
in meiner app gibt es bald einen in app purchase.
dafür habe ich folgenden Code:
Alles anzeigen
Das klappt auch perfekt.
ABER ich habe auch einen button "Einkauf wiederherstellen"
wenn ich den drücke, wird die func ButtonReBuy aufgerufen.
Habe eben einen Sandbox User getestet, welcher diesen Kauf noch nie getätigt hat.
Dann habe ich einfach Mal auf Einkauf wiederherstellen gedrückt und der User bekam die Vollversion freigeschaltet obwohl noch nie ein Kauf stattgefunden hat.
Was habe ich vergessen?
in meiner app gibt es bald einen in app purchase.
dafür habe ich folgenden Code:
Quellcode
- import UIKit
- import StoreKit
- class iAP: UITableViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver {
- let defaults = NSUserDefaults.standardUserDefaults()
- @IBOutlet weak var ButtonBuy: UIButton!
- @IBOutlet weak var MenuButton: UIBarButtonItem!
- @IBOutlet weak var ButtonReBuy: UIButton!
- @IBOutlet weak var BeschreibungiAP: UILabel!
- var productIDs: Array<String!> = []
- var productsArray: Array<SKProduct!> = []
- var selectedProductIndex: Int!
- var transactionInProgress = false
- override func viewWillAppear(animated: Bool) {
- navigationController?.setNavigationBarHidden(false, animated: true)
- productIDs.append("xxx")
- requestProductInfo()
- }
- override func viewDidLoad() {
- super.viewDidLoad()
- self.navigationController?.navigationBarHidden = true
- ButtonBuy.backgroundColor = UIColor.clearColor()
- ButtonBuy.layer.cornerRadius = 7
- ButtonBuy.layer.borderWidth = 1
- ButtonBuy.layer.borderColor = UIColor(red: (67/255.0), green: (145/255.0), blue: (44/255.0), alpha: 1.0).CGColor
- ButtonReBuy.backgroundColor = UIColor.clearColor()
- ButtonReBuy.layer.cornerRadius = 7
- ButtonReBuy.layer.borderWidth = 1
- ButtonReBuy.layer.borderColor = UIColor(red: (100/255.0), green: (100/255.0), blue: (100/255.0), alpha: 1.0).CGColor
- if self.revealViewController() != nil {
- MenuButton.target = self.revealViewController()
- MenuButton.action = "revealToggle:"
- self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
- }
- }
- @IBAction func Buy(sender: AnyObject) {
- if transactionInProgress {
- return
- }
- let payment = SKPayment(product: self.productsArray[0] as SKProduct)
- SKPaymentQueue.defaultQueue().addPayment(payment)
- self.transactionInProgress = true
- }
- // MARK: Custom method implementation
- func requestProductInfo() {
- if SKPaymentQueue.canMakePayments() {
- let productIdentifiers = NSSet(array: productIDs)
- let productRequest:SKProductsRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set<String>)
- productRequest.delegate = self
- productRequest.start()
- }
- else {
- print("Cannot perform In App Purchases.")
- }
- }
- func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
- if response.products.count != 0 {
- for product in response.products {
- productsArray.append(product )
- }
- let product = productsArray[0]
- BeschreibungiAP.text = product.localizedDescription
- let price = "\(product.price)"
- let FormatPrice = price.stringByReplacingOccurrencesOfString(".", withString: ",")
- ButtonBuy.setTitle("\(FormatPrice)€", forState: .Normal)
- SKPaymentQueue.defaultQueue().addTransactionObserver(self)
- }
- else {
- print("There are no products.")
- }
- if response.invalidProductIdentifiers.count != 0 {
- print("Invalid: \(response.invalidProductIdentifiers.description)")
- }
- }
- // MARK: SKPaymentTransactionObserver method implementation
- func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
- for transaction in transactions {
- switch transaction.transactionState {
- case SKPaymentTransactionState.Purchased:
- print("Transaction completed successfully.")
- defaults.setBool(true, forKey: "Vollversion")
- SKPaymentQueue.defaultQueue().finishTransaction(transaction)
- transactionInProgress = false
- self.performSegueWithIdentifier("exitIAP", sender: self)
- case SKPaymentTransactionState.Failed:
- print("Transaction Failed")
- SKPaymentQueue.defaultQueue().finishTransaction(transaction)
- print(transaction.error)
- transactionInProgress = false
- default:
- print("Default: \(transaction.transactionState.rawValue)")
- }
- }
- }
- @IBAction func ButtonReBuy(sender: AnyObject) {
- ButtonReBuy.setTitle("Lädt ...", forState: .Normal)
- SKPaymentQueue.defaultQueue().addTransactionObserver(self)
- SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
- }
- func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) {
- print("Transactions Restored")
- for transaction:SKPaymentTransaction in queue.transactions {
- if transaction.payment.productIdentifier == "xxx"
- {
- print("Consumable Product Purchased")
- defaults.setBool(true, forKey: "Vollversion")
- }
- }
- let alertView = UIAlertController(title: "Vielen Dank !", message: "Die Vollversion wurde wiederhergestellt.", preferredStyle: .ActionSheet)
- let backAction = UIAlertAction (title: "OK", style: .Default ) { alertAction in
- self.performSegueWithIdentifier("exitIAP", sender: self)
- }
- alertView.addAction(backAction)
- self.presentViewController(alertView, animated: true, completion: nil)
- }
- }
Das klappt auch perfekt.
ABER ich habe auch einen button "Einkauf wiederherstellen"
wenn ich den drücke, wird die func ButtonReBuy aufgerufen.
Habe eben einen Sandbox User getestet, welcher diesen Kauf noch nie getätigt hat.
Dann habe ich einfach Mal auf Einkauf wiederherstellen gedrückt und der User bekam die Vollversion freigeschaltet obwohl noch nie ein Kauf stattgefunden hat.
Was habe ich vergessen?