Swift/Xcode 9-在App购买中 - 在解开可选值时出乎意料地发现了无



我在从应用中删除广告时遇到了一些困难。

问题是当我单击"删除ADS"按钮时,应用程序与消息fatal error: unexpectedly found nil while unwrapping an Optional value崩溃。

我已经在网上看,但是它们似乎已经过时了。

我看了我的控制台,我可能发现了错误 product = (SKProduct)nil

有趣的是,我以前曾经实施过此方法,并且遇到了同样的问题,并且它奏效了。因此,我只是重新使用了代码并更改productID

我认为也许需要时间实际注册应用内购买的ID。但是,我已经醒来了同一问题。有人可以帮我告诉我问题可能是什么?

一旦我点击"删除广告"按钮,我的游戏就会崩溃。我的删除按钮的操作/方法是removeAds_TouchUpInside

import UIKit
import SpriteKit
import GameplayKit
import GoogleMobileAds
import StoreKit
class GameViewController: UIViewController, GADInterstitialDelegate, SKPaymentTransactionObserver, SKProductsRequestDelegate {
    var fullScreenAds : GADInterstitial!
    @IBOutlet weak var removeAdsButton: UIButton!
    var product: SKProduct?
    var productID = "com.USER.GAME.removeAds"
    override func viewDidLoad() {
       super.viewDidLoad()
        let save = UserDefaults.standard
        if save.value(forKey: "Purchase") == nil  {
            let request = GADRequest()
            request.testDevices = [kGADSimulatorID]
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: "loadAds"), object: nil)
        } else {
        }
              if let view = self.view as! SKView? {
            if let scene = SKScene(fileNamed: "GameMenuScene") {
                scene.scaleMode = .aspectFill
                view.presentScene(scene)
                }
            view.ignoresSiblingOrder = true
            view.showsFPS = false
            view.showsNodeCount = false
        }
    }
    override func viewDidAppear(_ animated: Bool) {
      super.viewDidAppear(animated)
    }
    @IBAction func removeAds_TouchUpInside(_ sender: Any) {
        let payment = SKPayment(product: product!)
        SKPaymentQueue.default().add(payment)
    }
    override func viewWillLayoutSubviews() {
        NotificationCenter.default.addObserver(self, selector: #selector(self.loadAds), name: NSNotification.Name(rawValue: "loadAds"), object: nil)
    }
    func loadAds() {
        self.fullScreenAds = createAndLoadInterstitials()
    }
    override var shouldAutorotate: Bool {
        return true
    }
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        if UIDevice.current.userInterfaceIdiom == .phone {
            return .allButUpsideDown
        } else {
            return .all
        }
    }
    override var prefersStatusBarHidden: Bool {
        return true
    }
    func createAndLoadInterstitials() -> GADInterstitial? {
        fullScreenAds = GADInterstitial(adUnitID: "ca-app-pub-7212561254132738/9424537183")
        guard let fullScreenAds = fullScreenAds else {
            return nil
        }
        let request = GADRequest()
        request.testDevices = [kGADSimulatorID]
        fullScreenAds.load(request)
        fullScreenAds.delegate = self
        return fullScreenAds
    }
    func interstitialDidReceiveAd(_ ad: GADInterstitial) {
        print("Ad received")
        ad.present(fromRootViewController: self)
    }
    func interstitialDidFail(toPresentScreen ad: GADInterstitial) {
        print("No ad can be loaded")
    }
    func getPurchaseInfo() {
        if SKPaymentQueue.canMakePayments() {
            let request = SKProductsRequest(productIdentifiers: NSSet(objects: self.productID) as! Set<String>)
            request.delegate = self
            request.start()
        } else {
            print("Enable in app purchase!")
            return
        }
    }
    func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
        var products = response.products
        if (products.count == 0) {
            print("Error")
            return
        } else {
            product = products[0]
            removeAdsButton.isEnabled = true
            print("Succes!")
        }
        let invalids = response.invalidProductIdentifiers
        for product in invalids {
            print("Product not found (product)")
        }
    }
    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            switch transaction.transactionState {
            case SKPaymentTransactionState.purchased:
                SKPaymentQueue.default().finishTransaction(transaction)
                print("SuccessPayementQeue!")
                removeAdsButton.isEnabled = false
                let save = UserDefaults.standard
                save.set(true, forKey: "Purchase")
                save.synchronize()
            case SKPaymentTransactionState.failed:
                SKPaymentQueue.default().finishTransaction(transaction)
                print("Failed transaction state")
            default:
                break
            }
        }
    }
}

您正在面临问题,因为您的 product nil,因此您可以在下面编写代码以解决它。

@IBAction func removeAds_TouchUpInside(_ sender: Any) {
        if let myP = product {
           let payment = SKPayment(product: myP)
           SKPaymentQueue.default().add(payment)
        }
        else {
            print("Product is not found.")
        }
}

相关内容

最新更新