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
}
}
}
}
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
@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