2017-09-28 4 views
-1

Ich habe einige Schwierigkeiten mit dem Entfernen von Anzeigen aus meiner App.Swift/Xcode 9 - In App-Käufe - unerwartet gefunden Null beim Entpacken ein Optionaler Wert

Das Problem ist, wenn ich auf die Schaltfläche Anzeigen entfernen klicken, stürzt die Anwendung mit der Nachricht fatal error: unexpectedly found nil while unwrapping an Optional value.

Ich habe online geschaut, sie scheinen jedoch veraltet zu sein.

Ich habe in meiner Konsole sehe, und ich kann den Fehler gefunden habe product = (SKProduct)nil

Das Komische ist, ich diese Methode einmal umgesetzt hatte vor und hatte das gleiche Problem, und aus heiterem Himmel hat es funktioniert. Also habe ich den Code einfach wieder verwendet und die productID geändert.

Ich dachte, vielleicht brauchte es Zeit, um die ID des In-App-Kaufs tatsächlich zu registrieren. Ich bin jedoch auf dasselbe Problem aufmerksam geworden. Könnte mir bitte jemand helfen und mir sagen, was das Problem sein könnte?

Mein Spiel stürzt ab, sobald ich auf die Schaltfläche Remove Ads tippe. Die Aktion/Methode für meine Schaltfläche zum Entfernen ist 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 
      } 
     } 
    } 
} 
+0

Mögliches Duplikat [Was bedeutet „fatale Fehler: unerwartet gefunden null, während einen optionalen Wert auspackt“ bedeuten?] (Https://stackoverflow.com/questions/32170456/what-does-fatal-error-unexpectedly -found-nil-while-unwrapping-an-optional-value) – Shades

+0

@Shades Ich weiß, was für ein fataler Fehler ist, Sie müssen zuerst den Wert entweder mit 'guard' oder' iflet' auspacken, aber es ist ein In-App-Kauf. Ich bin also ein großer Ahnungsloser. Hoffe das klärt alles auf. :) – SwiftLearner

Antwort

0

Sie Problem konfrontiert sind wegen Ihrer Produkt ist nil, so dass Sie Code wie unten schreiben kann es zu lösen.

@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.") 
     } 
} 
+0

Alles, was zu tun scheint, ist Drucken 'Produkt wird nicht gefunden. ' – SwiftLearner

+0

Ja, also sollten Sie sich ansehen, warum Ihr Produkt nicht gefunden wird? bedeutet, check product_id ist es richtig oder nicht? – Govaadiyo

+0

Meine Produkt ID ist korrekt, ich hatte dieses Problem vorher und plötzlich fing es an zu arbeiten. – SwiftLearner

Verwandte Themen