Invalid product identifier for IAP on tvOS

I am unable to get In-App Purchases working on a tvOS app target. The IAP SKProductsRequest is successful when running the same code in my iOS target/simulator, but does not work in either a tvOS simulator or physical device.

class StoreManager: NSObject, ObservableObject, SKProductsRequestDelegate, SKPaymentTransactionObserver {

    

    //FETCH PRODUCTS

    var request: SKProductsRequest!

    

    @Published var premium = SKProduct()

    

    func getProducts() {

        print("Start requesting products ...")

        let productID = "com.willswire.appname.premium"

        let request = SKProductsRequest(productIdentifiers: Set([productID]))

        request.delegate = self

        request.start()

    }

    

    func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {

        print("Did receive response")

        

        if let product = response.products.first {

            DispatchQueue.main.async {

                self.premium = product

            }

        }

        

        for invalidIdentifier in response.invalidProductIdentifiers {

            print("Invalid identifiers found: \(invalidIdentifier)")

        }

    }

    

    func request(_ request: SKRequest, didFailWithError error: Error) {

        print("Request did fail: \(error)")

    }

    

    //HANDLE TRANSACTIONS

    @Published var transactionState: SKPaymentTransactionState?

    

    func purchaseProduct() {

        if SKPaymentQueue.canMakePayments() {

            let payment = SKPayment(product: self.premium)

            SKPaymentQueue.default().add(payment)

        } else {

            print("User can't make payment.")

        }

    }

    

    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {

        for transaction in transactions {

            switch transaction.transactionState {

            case .purchasing:

                transactionState = .purchasing

            case .purchased:

                UserDefaults.standard.setValue(true, forKey: "premium")

                queue.finishTransaction(transaction)

                transactionState = .purchased

            case .restored:

                UserDefaults.standard.setValue(true, forKey: "premium")

                queue.finishTransaction(transaction)

                transactionState = .restored

            case .failed, .deferred:

                print("Payment Queue Error: \(String(describing: transaction.error))")

                queue.finishTransaction(transaction)

                transactionState = .failed

            default:

                queue.finishTransaction(transaction)

            }

        }

    }

}

Using the new StoreKit 2 framework seemed to remedy this issue. The sample code provided by Apple is extremely helpful in getting that set up.

Invalid product identifier for IAP on tvOS
 
 
Q