我正在尝试在我的游戏中集成一个非常基本的IAP,在这里我从我的GameScene调用
let alert = UIAlertController(title: "Upgrade", message: "Would you like to remove ads?", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Remove Ads", style: .default, handler: { action in
print("Pressed Remove Ads")
GameViewController().buytheIAP()
}))
alert.addAction(UIAlertAction(title: "Restore Purchases", style: .default, handler: { action in
print("Pressed Restore")
GameViewController().restoretheIAP()
}))
alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { action in
print("Pressed Cancel")
}))
view?.window?.rootViewController?.present(alert, animated: true, completion: nil)
}这些方法被正确调用,并在GameViewController.swift内部引用这些方法;
func buytheIAP(){
iAPHelper.purchase()
print("OK Lets upgrade")
}
func restoretheIAP(){
iAPHelper.restorePurchase()
print("OK Lets restore")
}
func restoreDidSucceed() {
UserDefaults.setValue(true, forKey: iAPHelper.productID)
//this should have something like hide banner etc.
bannerView.isHidden = true
}
func purchaseDidSucceed() {
UserDefaults.setValue(true, forKey: iAPHelper.productID)
//as above this should have something like hide banner etc.
bannerView.isHidden = true
print("Purchased upgrade ENJOYYYYYYYY")
}
func nothingToRestore() {
}
func paymentCancelled() {
}测试IAP通过,它从应用程序商店获得正确的信息,我使用我的沙箱详细信息进行购买,它正确通过并显示成功的购买消息。然而,bannerView不会隐藏,更重要的是,在重新启动游戏时,一切都会被遗忘,游戏会认为什么都没有购买。我猜一定是遗漏了某种支票。
我的viewDidLoad里有这个
if userDefaults.bool(forKey: iAPHelper.productID) {
bannerView.isHidden = true
print("It is purchased, so DO NOT show the ads")
} else{
bannerView.adSize = getAdaptiveSize()
bannerView.adUnitID = "ca-app-pub-3940256099942544/2934735716"
bannerView.delegate = self
bannerView.rootViewController = self
bannerView.load(GADRequest())
addBannerViewToView(bannerView)
print("Not purchased, so show the ads")
}并且它总是显示print("Not purchased, so show the ads")
用于购买的IAPHelper文件是;
func purchase() {
SwiftyStoreKit.purchaseProduct(productID, quantity: 1, atomically: true) { [self] result in
switch result {
case .success:
delegate?.purchaseDidSucceed()
print("OK It's purchased")
case .error(let error):
switch error.code {
case .unknown: print("Unknown error. Please contact support")
case .clientInvalid: print("Not allowed to make the payment")
case .paymentCancelled:
delegate?.paymentCancelled()
case .paymentInvalid: print("The purchase identifier was invalid")
case .paymentNotAllowed: print("The device is not allowed to make the payment")
case .storeProductNotAvailable: print("The product is not available in the current storefront")
case .cloudServicePermissionDenied: print("Access to cloud service information is not allowed")
case .cloudServiceNetworkConnectionFailed: print("Could not connect to the network")
case .cloudServiceRevoked: print("User has revoked permission to use this cloud service")
default: print((error as NSError).localizedDescription)
}
}
}
}
}而且日志确实显示了初始购买后的print("OK It's purchased") -所以我很难看出哪里出了问题。
发布于 2021-09-27 12:03:14
IAP委托函数不会(保证)在UI/主线程上调用,这就是视图不会隐藏的原因。
您没有看到一些iOS警告,提示您尝试在非主线程上设置UIView属性吗?
你的自定义购买信息没有保存在UserDefaults中的事实可能是因为过早地从Xcode中杀死了应用程序。
(UserDefaults确实会保存在正常应用流程中设置的内容。)
发布于 2021-09-28 09:43:50
好的,所以我想出了答案,在我的AppDelegate.swift部分didFinishLaunchingWithOptions中缺少一行
UserDefaults.standard.register(defaults: ["adRemove" : false])我重命名了userDefaults.bool(forKey: iAPHelper.productID),使其更易于使用/理解。因此,在我最初的帖子中,它已经被UserDefaults.standard.register(defaults: ["adRemove" : false])取代了。
然后,您可以在任何地方使用它进行检查,例如;
if !userDefaults.bool(forKey: "adRemove") {
// Do something here
}希望这对将来有同样问题的任何人都有帮助!
https://stackoverflow.com/questions/69346047
复制相似问题