[Swift] In-app purchase einrichten

AppDev04

Gala
Registriert
19.10.14
Beiträge
48
Versuche nun schon seit Tagen mit meiner App weiter zu kommen, aber leider kommen immer wieder grösser Stolpersteine in den Weg. Einer dieser Steine ist die In-app purchase Funktion. Ich möchte gerne meinen Nutzer die Möglichkeit geben, die Werbung zu entfernen und nebenbei ein paar tolle Features freizuschalten. Ich legte dazu im ItunesConnect Center zwei Nicht-Verbrauchsartikel an und gab ihnen die ID: seemu.iap.addcoins und seemu.iap.removeads (Testweise). Anschliessend fand ich folgenden SourceCode: https://github.com/awseeley/Swift-In-App-Purchase-Tutorial und baute es in meine App ein. Ich änderte die ID in meine und testete. Im Output Fenster erscheint die Meldung: IAP is enabled, loading. Die Button sind aber weiterhin nicht freigeschalten und ich kann nicht weiter agieren. Was mache ich falsch?

Code:
import UIKit
import StoreKit

class Shop: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver{
   
    @IBOutlet var lblAd: UILabel!
    @IBOutlet var lblCoinAmount: UILabel!
   
    @IBOutlet var outRemoveAds: UIButton!
    @IBOutlet var outAddCoins: UIButton!
    var coins = 50
   
    // 1
    override func viewDidLoad() {
        super.viewDidLoad()
        outRemoveAds.enabled = false
        outAddCoins.enabled = false
       
        // Set IAPS
        if(SKPaymentQueue.canMakePayments()) {
            print("IAP is enabled, loading")
            let productID:NSSet = NSSet(objects: "seemu.iap.addcoins", "seemu.iap.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 == "seemu.iap.removeads") {
                p = product
                buyProduct()
                break;
            }
        }
       
    }
   
    // 3
    @IBAction func btnAddCoins(sender: UIButton) {
        for product in list {
            let prodID = product.productIdentifier
            if(prodID == "seemu.iap.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()
   
    // seemu.iap.removeads
    // seemu.iap.addcoins
   
    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 )
        }
       
        outRemoveAds.enabled = true
        outAddCoins.enabled = true
    }
   
    func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) {
        print("transactions restored")
       
        for transaction in queue.transactions {
            let t: SKPaymentTransaction = transaction
           
            let prodID = t.payment.productIdentifier as String
           
            switch prodID {
            case "seemu.iap.removeads":
                print("remove ads")
                removeAds()
            case "seemu.iap.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 "seemu.iap.removeads":
                    print("remove ads")
                    removeAds()
                case "seemu.iap.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 trans");
    }
}
 

AppDev04

Gala
Registriert
19.10.14
Beiträge
48
Ich habe den Fehler gefunden. Er lag darin dass ich das ganze auf dem Simulator testen wollte. Auf meinem physischen iPhone funktionierts soweit gut. Ein Problem habe ich jedoch. Wenn ich den Einkauf wiederherstellen möchte und anschliessend die Aktion abbreche ist die Wiederherstellung trotzdem erfolgreich. Wie kann das sein? Gleicher Code wie oben...