首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftyStoreKit IAP购买,但在启动后不记得其设置

SwiftyStoreKit IAP购买,但在启动后不记得其设置
EN

Stack Overflow用户
提问于 2021-09-27 11:48:00
回答 2查看 46关注 0票数 1

我正在尝试在我的游戏中集成一个非常基本的IAP,在这里我从我的GameScene调用

代码语言:javascript
复制
 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内部引用这些方法;

代码语言:javascript
复制
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里有这个

代码语言:javascript
复制
 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文件是;

代码语言:javascript
复制
 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") -所以我很难看出哪里出了问题。

EN

回答 2

Stack Overflow用户

发布于 2021-09-27 12:03:14

IAP委托函数不会(保证)在UI/主线程上调用,这就是视图不会隐藏的原因。

您没有看到一些iOS警告,提示您尝试在非主线程上设置UIView属性吗?

你的自定义购买信息没有保存在UserDefaults中的事实可能是因为过早地从Xcode中杀死了应用程序。

(UserDefaults确实会保存在正常应用流程中设置的内容。)

票数 0
EN

Stack Overflow用户

发布于 2021-09-28 09:43:50

好的,所以我想出了答案,在我的AppDelegate.swift部分didFinishLaunchingWithOptions中缺少一行

代码语言:javascript
复制
UserDefaults.standard.register(defaults: ["adRemove" : false])

我重命名了userDefaults.bool(forKey: iAPHelper.productID),使其更易于使用/理解。因此,在我最初的帖子中,它已经被UserDefaults.standard.register(defaults: ["adRemove" : false])取代了。

然后,您可以在任何地方使用它进行检查,例如;

代码语言:javascript
复制
if !userDefaults.bool(forKey: "adRemove") {
// Do something here
}

希望这对将来有同样问题的任何人都有帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69346047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档