0

我在我的游戏中添加了一个非消耗品购买,用户可以在游戏中以 99 美分的价格购买一个角色。我还没有部署我的应用程序,但我需要先让付款工作,否则 App Store 不会接受它,所以我正在 Testflight 上进行测试。我看过很多关于如何购买物品的不同教程,但也有不同的方法。我想知道为什么购买有时只在我的应用程序中有效,因为我有一个朋友昨晚在 TestFlight 上对其进行了测试,但他无法打开支付窗口。他会按下“购买”按钮,但什么也没有发生,这是为什么呢?

这是当用户按下按钮购买角色时我调用的函数:

@objc func buyCharacterPressed(){ //Person clicks to buy the character!
    print("in buyCharacter func")
    guard let myProduct = myProduct else{
        return
    }
    if SKPaymentQueue.canMakePayments() {
        let payment = SKPayment(product: myProduct)
        SKPaymentQueue.default().add(self)
        SKPaymentQueue.default().add(payment)
    }
}

这是我的 productsRequest 函数:

func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
    print("inside productsRequest func")
    //print(response.products.first)
    if let product = response.products.first{
        myProduct = product
        print(product.productIdentifier)
        print(product.price)
        print(product.localizedTitle)
        print(product.localizedDescription)
    }
}

这是我的 fetchProducts 函数(blablabla 是我在代码中购买的实际地址):

func fetchProducts(){
    let request = SKProductsRequest(productIdentifiers: Set(["com.kylan.blablabla"]))
    request.delegate = self
    request.start()
}

最后是我的支付队列:

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for transaction in transactions {
        switch transaction.transactionState {
        case .purchasing:
            print("purchasing...")
            characterInfoLabel1.text = "Purchasing..."
            break
        case .purchased, .restored:
            //unlock their item
            print("Item has been purchased!")
            let defaults = UserDefaults()
            defaults.set(true, forKey: "purchasedPhotoCharacter")
            
            SKPaymentQueue.default().finishTransaction(transaction)
            SKPaymentQueue.default().remove(self)
            
            restorePurchasesButton.removeFromSuperview()
            buyOrDoneButton.removeFromSuperview()
            let CreateCharacterScene = CreateCharacter(size: scene!.size)
            self.view?.presentScene(CreateCharacterScene)
            HapticsManager.sharedInstance.selectionVibrate()
            break
        case .failed, .deferred:
            SKPaymentQueue.default().finishTransaction(transaction)
            SKPaymentQueue.default().remove(self)
            characterInfoLabel1.text = "blablabla!"
            print("payment .failed or .deferred")
            break
        default:
            SKPaymentQueue.default().finishTransaction(transaction)
            SKPaymentQueue.default().remove(self)
            break
        }
    }
}

另外,我不确定我的 restorePurchases 按钮是否正确,我在网上看到了一些相互冲突的教程,并且它并不总是与 TestFlight 一起使用。有时按钮没有任何作用,我必须再次购买,但当我再次购买时,它说我已经购买了...这是功能,它的超级基本所以我希望有人知道我应该怎么做:

@objc func restorePurchases(){
    SKPaymentQueue.default().add(self)
    SKPaymentQueue.default().restoreCompletedTransactions()
}

相互冲突的教程说我需要 .add(self) 但另一个说我只需要 restoreCompletedTransactions()。哪一个是对的??

非常感谢您阅读我的长问题,对不起,它太长了,但我想确保我做对了,这是我提交应用程序之前需要做的最后一件事!!!

4

0 回答 0