暂停SpriteKit游戏 – UIApplicationWillResignActive与UIApplicationDidBecomeActive?

我理解这两种方法之间的区别,但是我想知道是否在使用UIApplicationWillResignActive(而不是UIApplicationDidBecomeActive(或UIApplicationDidEnterBackground))时会有缺点,例如暂停SpriteKit游戏。 我一直在网站上的线程漫游,并注意到,通常回答问题如何暂停一个SpriteKit游戏,UIApplicationDidBecomeActive和UIApplicationDidEnterBackgroundbuild议,而不是UIApplicationWillResignActive。 由于UIApplicationWillResignActive也会因为Siri / Calls而暂停游戏,所以在处理暂停SpriteKit游戏时使用这种方法不是最好的方法,还是使用它有一些缺点?

下面我有我的通知和暂停function:

NotificationCenter.default.addObserver(self, selector: #selector(self.pauseGame), name:NSNotification.Name.UIApplicationDidBecomeActive, object: nil) //OR NotificationCenter.default.addObserver(self, selector: #selector(self.pauseGame), name:NSNotification.Name.UIApplicationWillResignActive, object: nil) 

暂停function:

 func pauseGame(){ print(self.scene?.isPaused) if sceneIsPaused == true || isGameOver == true{ return } leftMobGenTimer.invalidate() rightMobGenTimer.invalidate() genDragonTimer.invalidate() checkNinjaTimer.invalidate() chiStrikeTimer.invalidate() randCoinTimer.invalidate() print("Timer stopped?") if soundEnabled == true{ player.pause() } self.scene?.isPaused = true sceneIsPaused = true makePauseView() } 

暂停

这是关于applicationWillResignActive方法的文档:

您应该使用此方法暂停正在进行的任务,禁用定时器,并降低OpenGL ES帧速率。 游戏应该使用这种方法来暂停游戏。 处于非活动状态的应用程序在等待转换到活动状态或背景状态时应该做最less的工作。

所以这个方法是用来暂停游戏的。

取消暂停

iirc,应用程序从非激活状态转换到激活状态时,游戏应该自动保持不变。 这是applicationDidBecomeActive方法被调用的时刻,所以在某些情况下,您可能也想在这里暂停游戏……但这取决于您的游戏。

我不知道为什么你提到了applicationDidBecomeActiveapplicationDidEnterBackground组合以暂停/取消暂停…因为在applicationDidEnterBackground暂停游戏可能已经太迟了,从技术上说,不需要在applicationDidBecomeActive取消暂停游戏,因为这是自动完成的。