restore in app purchase

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • restore in app purchase

    hallo zusammen,

    in meiner app gibt es bald einen in app purchase.
    dafür habe ich folgenden Code:

    Quellcode

    1. import UIKit
    2. import StoreKit
    3. class iAP: UITableViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver {
    4. let defaults = NSUserDefaults.standardUserDefaults()
    5. @IBOutlet weak var ButtonBuy: UIButton!
    6. @IBOutlet weak var MenuButton: UIBarButtonItem!
    7. @IBOutlet weak var ButtonReBuy: UIButton!
    8. @IBOutlet weak var BeschreibungiAP: UILabel!
    9. var productIDs: Array<String!> = []
    10. var productsArray: Array<SKProduct!> = []
    11. var selectedProductIndex: Int!
    12. var transactionInProgress = false
    13. override func viewWillAppear(animated: Bool) {
    14. navigationController?.setNavigationBarHidden(false, animated: true)
    15. productIDs.append("xxx")
    16. requestProductInfo()
    17. }
    18. override func viewDidLoad() {
    19. super.viewDidLoad()
    20. self.navigationController?.navigationBarHidden = true
    21. ButtonBuy.backgroundColor = UIColor.clearColor()
    22. ButtonBuy.layer.cornerRadius = 7
    23. ButtonBuy.layer.borderWidth = 1
    24. ButtonBuy.layer.borderColor = UIColor(red: (67/255.0), green: (145/255.0), blue: (44/255.0), alpha: 1.0).CGColor
    25. ButtonReBuy.backgroundColor = UIColor.clearColor()
    26. ButtonReBuy.layer.cornerRadius = 7
    27. ButtonReBuy.layer.borderWidth = 1
    28. ButtonReBuy.layer.borderColor = UIColor(red: (100/255.0), green: (100/255.0), blue: (100/255.0), alpha: 1.0).CGColor
    29. if self.revealViewController() != nil {
    30. MenuButton.target = self.revealViewController()
    31. MenuButton.action = "revealToggle:"
    32. self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    33. }
    34. }
    35. @IBAction func Buy(sender: AnyObject) {
    36. if transactionInProgress {
    37. return
    38. }
    39. let payment = SKPayment(product: self.productsArray[0] as SKProduct)
    40. SKPaymentQueue.defaultQueue().addPayment(payment)
    41. self.transactionInProgress = true
    42. }
    43. // MARK: Custom method implementation
    44. func requestProductInfo() {
    45. if SKPaymentQueue.canMakePayments() {
    46. let productIdentifiers = NSSet(array: productIDs)
    47. let productRequest:SKProductsRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set<String>)
    48. productRequest.delegate = self
    49. productRequest.start()
    50. }
    51. else {
    52. print("Cannot perform In App Purchases.")
    53. }
    54. }
    55. func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
    56. if response.products.count != 0 {
    57. for product in response.products {
    58. productsArray.append(product )
    59. }
    60. let product = productsArray[0]
    61. BeschreibungiAP.text = product.localizedDescription
    62. let price = "\(product.price)"
    63. let FormatPrice = price.stringByReplacingOccurrencesOfString(".", withString: ",")
    64. ButtonBuy.setTitle("\(FormatPrice)€", forState: .Normal)
    65. SKPaymentQueue.defaultQueue().addTransactionObserver(self)
    66. }
    67. else {
    68. print("There are no products.")
    69. }
    70. if response.invalidProductIdentifiers.count != 0 {
    71. print("Invalid: \(response.invalidProductIdentifiers.description)")
    72. }
    73. }
    74. // MARK: SKPaymentTransactionObserver method implementation
    75. func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    76. for transaction in transactions {
    77. switch transaction.transactionState {
    78. case SKPaymentTransactionState.Purchased:
    79. print("Transaction completed successfully.")
    80. defaults.setBool(true, forKey: "Vollversion")
    81. SKPaymentQueue.defaultQueue().finishTransaction(transaction)
    82. transactionInProgress = false
    83. self.performSegueWithIdentifier("exitIAP", sender: self)
    84. case SKPaymentTransactionState.Failed:
    85. print("Transaction Failed")
    86. SKPaymentQueue.defaultQueue().finishTransaction(transaction)
    87. print(transaction.error)
    88. transactionInProgress = false
    89. default:
    90. print("Default: \(transaction.transactionState.rawValue)")
    91. }
    92. }
    93. }
    94. @IBAction func ButtonReBuy(sender: AnyObject) {
    95. ButtonReBuy.setTitle("Lädt ...", forState: .Normal)
    96. SKPaymentQueue.defaultQueue().addTransactionObserver(self)
    97. SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
    98. }
    99. func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) {
    100. print("Transactions Restored")
    101. for transaction:SKPaymentTransaction in queue.transactions {
    102. if transaction.payment.productIdentifier == "xxx"
    103. {
    104. print("Consumable Product Purchased")
    105. defaults.setBool(true, forKey: "Vollversion")
    106. }
    107. }
    108. let alertView = UIAlertController(title: "Vielen Dank !", message: "Die Vollversion wurde wiederhergestellt.", preferredStyle: .ActionSheet)
    109. let backAction = UIAlertAction (title: "OK", style: .Default ) { alertAction in
    110. self.performSegueWithIdentifier("exitIAP", sender: self)
    111. }
    112. alertView.addAction(backAction)
    113. self.presentViewController(alertView, animated: true, completion: nil)
    114. }
    115. }
    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?
  • Nun, du schaltest die Vollversion ja auch in paymentQueueRestoreCompletedTransactionsFinished frei. Lies mal die Doku dazu, dort musst du nämlich eigentlich gar nichts machen und der Aufruf verrät dir nicht, ob der Einkauf wirklich wiederhergestellt werden konnte. Das passiert in paymentQueue, wo du zusätzlich transactionState auf .Restored testen musst. Wenn transactionState diesen Status hat, dann wurde der Einkauf wiederhergestellt.

    Gruß
    So Long, and Thanks for All the Fish.