0

My app includes some In-App Purchases and whenever the app is opened my phone continues to keep asking me to sign into the iTunes Store. How do I stop this from happening?

    override func viewDidLoad() {
    super.viewDidLoad()

     SKPaymentQueue.defaultQueue().addTransactionObserver(self)

    // Do any additional setup after loading the view, typically from a nib.
    // Set IAPS

        if(SKPaymentQueue.canMakePayments()) {
            print("In-App Purchases Enabled, Loading")
            let productID:NSSet = NSSet(objects: "my bundle ;)")
            let request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>)
            request.delegate = self
            request.start()
        } else {
            print("Please enable In-App Purchases.")
    }

    showInStore()

}  

override func viewDidDisappear(animated: Bool) {

    SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
}


    @IBAction func btnRemoveAds(sender: UIButton) {
    for product in list {
        let prodID = product.productIdentifier
        if(prodID == "my bundle") {
            p = product
            buyProduct()

// removeAds() break } else if(prodID == "my bundle") {

            w = product
            buyProduct()
            break
        }
    }

}


    func removeAds() {

    self.view.willRemoveSubview(self.adView)
    self.adView.hidden = true
}

    @IBAction func RestorePurchases(sender: UIButton) {
    SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
}

var list = [SKProduct]()
var p = SKProduct()
var w = SKProduct()

func buyProduct() {
    print("Buy " + p.productIdentifier)
    let pay = SKPayment(product: p)
    SKPaymentQueue.defaultQueue().addPayment(pay as SKPayment)
}

func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
    print("Requesting Product")
    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)

    }


}

func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) {
    print("Purchases Restored")

    _ = [] // Swift 2 made me replace with a _ : orginal is let purchasedItemIDS[]
    for transaction in queue.transactions {
        let t: SKPaymentTransaction = transaction

        let prodID = t.payment.productIdentifier as String

        switch prodID {
        case "my bundle ;)":
            print("Removing Ads")
            removeAds()
            systemStatus.text = "Ads have been removed on this device! "
            systemStatus.textColor = UIColor.greenColor()


        default:
            print("In-App Purchases 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("Unlock In-App Purchases Here.")
            print(p.productIdentifier)
            let prodID = p.productIdentifier as String
            switch prodID {
            case "my bundle ;)":
                print("Remove Ads")
                removeAds()
                systemStatus.text = "Ads have been removed on this device! "
                systemStatus.textColor = UIColor.greenColor()


            default:
                print("In-App Purchases Not Setup")
            }

            queue.finishTransaction(trans)
            break
        case .Failed:
            print("Purchase Error")
            queue.finishTransaction(trans)
            break
        default:
            print("Nothing")
            break

        }
    }
}

func finishTransaction(trans:SKPaymentTransaction)
{
    print("Transactions Completed.")
    SKPaymentQueue.defaultQueue().finishTransaction(trans)
    removeAds()
    systemStatus.text = "Ads have been removed on this device! "
    systemStatus.textColor = UIColor.greenColor()


}

func paymentQueue(queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction])
{
    print("Transactions Removed")
}
Amit Kalra
  • 4,085
  • 6
  • 28
  • 44
  • Have a look at http://stackoverflow.com/questions/4988663/skpaymentqueue-addtransactionobserver-asking-for-app-store-password-on-startup-a – Michael Jan 20 '16 at 23:26
  • Maybe you should post your code then. Do you know that `finishTransaction` is actually being called? It can throw an exception too. What have you done to troubleshoot the problem? – Michael Jan 21 '16 at 06:17

1 Answers1

0

Looking at your code now you are doing the first 2 mistakes I mentioned.

1) You should add the transaction observer at app launch or when you init the shop. Go to your buy/restore functions and take out this line

 SKPaymentQueue.defaultQueue().addTransactionObserver(self)

and move it to viewDidLoad. A lot of tutorials teach you this the wrong way.

2) I cannot see the code where you remove the transaction observer. You need to call

   SKPaymentQueue.defaultQueue().removeTransactionObserver(self)

when you exit your shop. This will most likely cause your issues.

3) In general your code is a bit messy. For example in the delegate function "didFinishTransaction" you are calling a method to remove Ads. This is not the place for it.

Have a look at this answer to see how you could structure your code better

Restore Purchase : Non-Consumable

Original answer:

Quite a common occurrence with IAPs if done incorrectly, it basically means an old transaction is sticking around. There is a few things to bear in mind in your IAP code.

1) make sure you add the transactionObserver once at app launch. Most tutorials add it each time an item is bought which is not what Apple reccommends.

2) remove the transaction observer once your app is closed.

3) make sure you call finish transaction every time a purchase is made.

It's hard to help without seeing your code.

Community
  • 1
  • 1
crashoverride777
  • 10,581
  • 2
  • 32
  • 56