Search code examples
iosswiftsandboxstorekit

Having trouble receiving any pop up or prompt for user sign in


I have followed a walkthrough to include a non-consumable in-app purchase. Unfortunately, nothing is happening at all after the user clicks the button for the purchase. I am not getting any prompt to log in to iTunes or to accept the payment. Is there something I am missing here?

I have tried multiple walkthroughs and they all seem to have the similar code, I have followed the steps through the apple website, however I am unsure as to whether I have to do a full app submission before I can test the in-app purchases through a sandbox.

IAPService.swift

import Foundation
import StoreKit
import UIKit

class IAPService: NSObject {

    private override init() {}
    static let shared = IAPService()

    var products = [SKProduct]()
    let paymentQueue = SKPaymentQueue.default()

    func getProducts() {
        let products: Set = [IAPProduct.nonConsumable.rawValue]
       let request = SKProductsRequest(productIdentifiers: products)
        request.delegate = self
        request.start()
        paymentQueue.add(self)
    }

    func purchase(product: IAPProduct) {
        guard let productToPurchase = products.filter({ 
$0.productIdentifier == product.rawValue }).first else { return }
        let payment = SKPayment(product: productToPurchase)
        paymentQueue.add(payment)
    }

    func restorePurchases() {
        print("restore purchases")
        paymentQueue.restoreCompletedTransactions()
    }

}

extension IAPService: SKProductsRequestDelegate {
    func productsRequest(_ request: SKProductsRequest, didReceive 
         response: SKProductsResponse) {
            products = response.products
            for product in response.products {
            print(product.localizedTitle)
        }
    }
}

extension IAPService: SKPaymentTransactionObserver {
    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions 
        transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
        print(transaction.transactionState.status(), 
        transaction.payment.productIdentifier)

            switch transaction.transactionState {
            case .purchasing: break
            default: queue.finishTransaction(transaction)
            }
        }
    }
}

extension SKPaymentTransactionState {
    func status() -> String {
        switch self {
        case .deferred: return "deferred"
        case .failed: return "failed"
        case .purchased: return "purchased"
        case .purchasing: return "purchasing"
        case .restored: return "restored"
        }
    }
}

In my products file

IAP.Products.swift

import Foundation

enum IAPProduct: String {
     case nonConsumable = "Quizly"
}

In my mainVC

override func viewDidLoad() {
        super.viewDidLoad()
        setupViews()
        IAPService.shared.getProducts()
        print("IAP == \(IAPService.shared.products)") // Why is this an empty array?
    }

@objc func pressToGetPremium(_ sender : UIButton) {        
        IAPService.shared.purchase(product: .nonConsumable)
        print("IAP ===== \(IAPService.shared.products)")
}

When the user clicks the button I was hoping that a pop up would come up first making the user have to sign in to their apple account and then another pop up would ask if they wanted to accept the non-consumable product ($1.99) etc. But I am not getting a pop up at all.

I am receiving this back from didReceive products......

response SKProductsResponse 0x00000002811cba10 baseNSObject@0 NSObject
isa Class 0x2811cba10 0x00000002811cba10 _internal SKProductsResponseInternal * 0x28139c0e0 0x000000028139c0e0 NSObject NSObject
_invalidIdentifiers __NSSingleObjectArrayI * 1 element 0x00000002811cb930 [0] __NSCFString * "Quizly" 0x000000028139c620 NSMutableString NSMutableString _products __NSArray0 * 0 elements 0x00000002811c0050 NSArray NSArray NSObject NSObject
isa Class __NSArray0 0x000001a25a605811


Solution

  • As per our comment discussion - The error produced from the didReceive products method indicates your bundleIdentifiers are not matching the ones on the appStore.