天道酬勤,学无止境

AVAudioSession 重新激活问题(AVAudioSession reactivation issue)

问题

我收到以下错误:

[0x19bf89310] AVAudioSession.mm:646: -[AVAudioSession setActive:withOptions:error:]: 停用正在运行 I/O 的音频会话。 在停用音频会话之前,应停止或暂停所有 I/O。

我已经阅读了这篇文章:

  • iOS8 AVAudioSession setActive 错误

但是那里的解决方案并没有解决我的问题。 即:

  • 小应用(游戏)
  • 在 AudioHelper.swift 中处理的音频背景音乐
  • 使用SKActino.playSoundFile播放的附加“blip”声音

再生产

  • 开始游戏(背景音乐开始播放)
  • 关闭游戏(音乐停止)
  • 重新开始游戏(音乐重新开始)
  • 出现上面的错误
  • SKAction.playSoundFile 不再总是有效(有些可以,有些不可以)

我的音频处理代码(又名 AudioHelper.swift)

class AudioHelper: NSObject, AVAudioPlayerDelegate {
    var player : AVAudioPlayer?

    class var defaultHelper : AudioHelper {
        struct Static {
            static let instance : AudioHelper = AudioHelper()
        }

        return Static.instance
    }

    override init() {
        super.init()
    }

    func initializeAudio() {
        var url = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("sound_float", ofType: ".mp3")!)
        self.player = AVAudioPlayer(contentsOfURL: url, error: nil)
        self.player?.numberOfLoops = -1
        self.player?.play()
    }

    func stopAudio() {
        self.player?.stop()
        self.player?.prepareToPlay()
        AVAudioSession.sharedInstance().setActive(false, error: nil)
    }

    func startAudio() {
        AVAudioSession.sharedInstance().setActive(true, error: nil)
        self.player?.play()
    }

    func audioPlayerDidFinishPlaying(player: AVAudioPlayer!, successfully flag: Bool) {
        self.stopAudio()
    }
}

我正在通过AppDelegate初始化 & 暂停 & 开始

class AppDelegate: UIResponder, UIApplicationDelegate {


    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        AudioHelper.defaultHelper.initializeAudio()
        return true
    }

    func applicationWillResignActive(application: UIApplication) {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
        AudioHelper.defaultHelper.stopAudio()
    }

    func applicationDidBecomeActive(application: UIApplication) {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
        AudioHelper.defaultHelper.startAudio()
    }
}

我哪里错了?

回答1

我不得不将setActive(false)移动到委托方法。 新的助手类如下所示:

import Foundation
import AVFoundation

class AudioHelper: NSObject, AVAudioPlayerDelegate {
    var player : AVAudioPlayer?

    
    class var defaultHelper : AudioHelper {
        struct Static {
            static let instance : AudioHelper = AudioHelper()
        }
        
        return Static.instance
    }
    
    override init() {
        super.init()
    }
    
    func initializeAudio() {
        var url = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("sound_float", ofType: ".mp3")!)
        self.player = AVAudioPlayer(contentsOfURL: url, error: nil)
        self.player?.numberOfLoops = -1
        self.player?.play()

    }
    
    func stopAudio() {
        self.player?.stop()
        self.player?.prepareToPlay()
    }
    
    func startAudio() {
        AVAudioSession.sharedInstance().setActive(true, error: nil)
        self.player?.play()
    }
    
    
    func audioPlayerDidFinishPlaying(player: AVAudioPlayer!, successfully flag: Bool) {
        AVAudioSession.sharedInstance().setActive(false, error: nil)
    }
}

现在工作

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Sprite Kit和播放声音会导致应用终止(Sprite Kit & playing sound leads to app termination)
    问题 使用ARC 我遇到的一个问题-我有一个SKScene,其中我使用SKAction类方法播放声音效果 [SKAction playSoundFileNamed:@"sound.wav" waitForCompletion:NO]; 现在,当我尝试进入后台时,无论声音结束了,显然由于gpus_ReturnNotPermittedKillClient ,iOS都终止了我的应用程序。 现在,只有当我对此行发表评论且未执行操作时,iOS才会在后台很好地运行它(当然,已暂停,但没有终止)。 我究竟做错了什么? 编辑:如果该行未运行,则iOS将不会终止该应用程序,例如,如果它在if statement中未运行(soundOn == YES)或类似的情况,则布尔值为false 回答1 问题是当应用程序进入后台时, AVAudioSession无法处于活动状态。 这并不是立即显而易见的,因为Sprite Kit没有提到它在内部使用AVAudioSession。 修复非常简单,并且适用于ObjectAL =>在应用程序处于后台时将AVAudioSession设置为非活动状态,并在应用程序进入前景时重新激活音频会话。 具有此修复程序的简化的AppDelegate如下所示: #import <AVFoundation/AVFoundation.h> ... - (void
  • AVAudioSession reactivation issue
    I am getting the following error: [0x19bf89310] AVAudioSession.mm:646: -[AVAudioSession setActive:withOptions:error:]: Deactivating an audio session that has running I/O. All I/O should be stopped or paused prior to deactivating the audio session. I have read through this post: iOS8 AVAudioSession setActive error however the solution there did not solve my problem. which is: small application (game) audio background music handled in AudioHelper.swift additional 'blip' sounds played with SKActino.playSoundFile reproduction start game (background music starts to play) close game (music stops)
  • AVplayer在来电后恢复(AVplayer resuming after incoming call)
    问题 我使用AVPlayer音乐播放。 我的问题是,来电后,玩家将不会恢复。 如何处理这当有来电来? 回答1 从iOS 6中,你必须处理开始AVAudioSessionInterruptionNotification和AVAudioSessionMediaServicesWereResetNotification ,这一点,你必须使用委托方法之前。 首先,你应该叫AVAudioSession单和配置你期望的使用。 例如: AVAudioSession *aSession = [AVAudioSession sharedInstance]; [aSession setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:&error]; [aSession setMode:AVAudioSessionModeDefault error:&error]; [aSession setActive: YES error: &error]; 那么你应该实现两个方法,为此AVAudioSession会打电话通知: [[NSNotificationCenter defaultCenter] addObserver:self selector
  • 如何解决 iOS 中的 AVCaptureSession v AVAudioSession 冲突?(How to resolve AVCaptureSession v AVAudioSession conflict in iOS?)
    问题 我正在尝试在视图控制器中运行 AVCaptureSession,但在同一个视图中,我还从使用 AVAudioSession 的库中调用了一个函数。 我似乎无法从调试器中获得太多信息,除了在我调用这个特定库的函数时它会崩溃。 该库是 libpd: https://github.com/libpd 并将 AVAudioSession 称为 sharedInstance。 我称 libpd 为: [self.audioController configurePlaybackWithSampleRate:44100 numberChannels:2 inputEnabled:YES mixingEnabled:YES] 所以启用了混合,但为了以防万一,我重新编译了它,以便在它初始化时,我这样做: UInt32 doSetProperty = 1; AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty); 但是,没有运气。 将调用 libpd 移动到视图控制器中的 viewWillAppear 也不起作用。 但是,如果我将调用 libpd 的代码从我的视图控制器中取出,并将其放入
  • AVAudioRecorder & AVAudioPlayer - 内置扬声器的声音输出,如何更改?(AVAudioRecorder & AVAudioPlayer - Sound output on internal speaker, how to change?)
    问题 我有 AVAudioRecorder 和 AVAudioPlayer 的问题。 当我同时使用播放器和录音时(例如,在录音时播放声音)声音在安静的内部扬声器中。 我搜索了stackoverflow,我发现的只是这段代码: UInt32 *audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); 但这对我没有帮助:(当我复制粘贴时,出现错误。我该怎么做才能录制和播放底部的扬声器? 我不使用像 SCLister 那样的东西... 提前致谢 最大限度 回答1 这有点旧,但这篇文章对我有帮助,我想为将来可能需要它的其他人更新它。 顶部发布的代码是正确的 - 它将通过电话扬声器播放的安静音频并将其路由到底部的扬声器。 代码中有一个小错别字,这就是它给出错误的原因。 这是可以解决此问题的正确代码段: UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; AudioSessionSetProperty
  • AVAudioSession AVAudioSessionCategoryPlayAndRecord 故障(AVAudioSession AVAudioSessionCategoryPlayAndRecord glitch)
    问题 我想使用AVCaptureSession录制带音频的视频。 为此,我需要 AudioSessionCategory AVAudioSessionCategoryPlayAndRecord ,因为我的应用程序还播放带声音的视频。 我希望可以从默认扬声器中听到音频,并且希望它与其他音频混合。 所以我需要选项AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionMixWithOthers AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionMixWithOthers 。 如果我在播放其他音频时执行以下操作,则其他应用程序的音频中会出现明显的声音故障: [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDefaultToSpeaker error:nil]; [[AVAudioSession
  • 音频会话中断结束后,AVAudioRecorder没有在后台录制(AVAudioRecorder not recording in background after audio session interruption ended)
    问题 我正在前景和背景中都在应用程序中录制音频。 我还处理AVAudioSessionInterruptionNotification以在中断开始时停止记录,并在结束时重新开始。 虽然在前台它可以按预期工作,但是当应用在后台录制并且我接到电话时,通话结束后它不会再次开始录制。 我的代码如下: - (void)p_handleAudioSessionInterruptionNotification:(NSNotification *)notification { NSUInteger interruptionType = [[[notification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey] unsignedIntegerValue]; if (interruptionType == AVAudioSessionInterruptionTypeBegan) { if (self.isRecording && !self.interruptedWhileRecording) { [self.recorder stop]; self.interruptedWhileRecording = YES; return; } } if (interruptionType ==
  • AVAudioSession endInterruption() returns an NSOSStatusErrorDomain
    I'm trying to solve an AVAudioSession problem since many hours ago and didn't get success!! I found lots of guys talking about problems with endInterruption but none of them talking about this error: Unable to reactivate the audio session after the interruption ended: Error Domain=NSOSStatusErrorDomain Code=560161140 "The operation couldn’t be completed. (OSStatus error 560161140.)" I tried converting this code to ASCII to check the Audio Code Results, but there is nothing related to this number. My code to init the session: - (void) setupAudioSession { mySession = [AVAudioSession
  • 当使用 AVPlayer 播放视频时,它会停止背景音乐 ios(When Video plays using AVPLayer, it stops background music ios)
    问题 我正在使用AVPlayer播放视频,它会停止正在后台播放的 iPhone 音乐。 请帮我解决 let item1 = AVPlayerItem.init(URL: NSURL(string:path)) player = AVPlayer(playerItem: item1) layer?.player = player; player?.play() 回答1 我的电影是用于动画的; 他们没有声音。 要让其他声音继续播放,在 Swift 中: // None of our movies should interrupt system music playback. _ = try? AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, mode: .default, options: .mixWithOthers) 感谢马库斯亚当斯的原始答案。 回答2 为 AVAudioSession 使用允许混合的类别,例如AVAudioSessionCategoryPlayback并添加AVAudioSessionCategoryOptionMixWithOthers 。 从文档: AVAudioSessionCategoryOptionMixWithOthers
  • 应用程序在后台 iOS 中播放音频(Audio playing while app in background iOS)
    问题 我有一个主要基于 Core Bluetooth 的应用程序。 当特定的事情发生时,应用程序会使用 Core Bluetooth 后台模式唤醒并触发警报,但是当应用程序不在前台时,我无法让警报正常工作。 我有一个 Alarm Singleton 类,它像这样初始化AVAudioPlayer : NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:soundName ofType:@"caf"]]; self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; [[AVAudioSession sharedInstance] setActive: YES error: nil]; [self.player prepareToPlay]; self.player.numberOfLoops = -1; [self.player setVolume:1.0]; NSLog(@"%@", self.player)
  • AVAudioSession / Audio Session Services 切换输出(AVAudioSession / Audio Session Services switching output)
    问题 好的,我的 AVAudioSession 定义如下(是的,c 和 obj-c 调用的混合)另外请注意,该应用程序具有后台模式音频,因为如果在应用程序处于后台时,它必须继续这样做: [(AVAudioSession *)[AVAudioSession sharedInstance] setDelegate: self]; // Allow the app sound to continue to play when the screen is locked. [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; //Turn off automatic gain on the microphone [[AVAudioSession sharedInstance] setMode:AVAudioSessionModeMeasurement error:nil]; //Turn on the ability to mix with others UInt32 doSetProperty = 1; AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers
  • AVAudioSession中断(AVAudioSession Interruptions)
    问题 因此,在运行于iOS 6的我的应用中,一切似乎都可以在音频上正常工作。 我使用旧的C API格式通过回调来捕获中断。 通过以下AudioSessionInitialize(NULL, NULL, interruptionListenerCallback, (__bridge void *)self)设置: AudioSessionInitialize(NULL, NULL, interruptionListenerCallback, (__bridge void *)self) ,它很棒。 但是,使用iOS 7 SDK时,当设备收到呼叫或警报响起时,似乎从未调用过我的中断回调。 环顾四周后,我听说旧的C api已被弃用,您应该使用新的AVAudioSession函数。 更多的阅读揭示了AVAudioSession委托已被弃用,您应该将NSNotification用于AVAudioSessionInterruptionNotification来捕获中断并执行所需的任何操作。 对我来说,似乎从未真正触发过此通知,因此我也从未受到适当的打扰,从而在通话结束后中断了我的所有音频内容。 我注册通知是这样的: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector
  • AVAudioSession的OutputVolume永远不会改变(AVAudioSession's OutputVolume never changes)
    问题 SO上有很多问题和答案,它们说[AVAudioSession sharedInstance].outputVolume是检测设备音量的唯一方法。 但这似乎不太正确。 虽然首次设置outputVolume时是正确的(在应用程序启动时),但它永远不会改变。 我做错了吗? 除了读取outputVolume的值外,我不知道还能做什么。 我的直觉会告诉我这是一个错误,如果不是因为其他人似乎做得很好。 我也在iOS 7和8上进行了测试,因此它不是iOS 8的错误。 我在一个小型测试项目中复制了相同的内容,因此项目中没有任何干扰。 另外:我很清楚铃声音量和声音音量之间的区别。 我都更改了,报告的数量仍然没有变化。 这是我在测试项目中使用的功能: - (void)checkVolume { float volume = [AVAudioSession sharedInstance].outputVolume; NSLog(@"Volume: %f", volume); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^ { [self checkVolume]; }); } 回答1 使用KVO
  • 进入背景时Spritekit崩溃(Spritekit crashes when entering background)
    问题 好的,我一直在开发一个应用程序,其中有一个带有SKAction对象的NSMutableDictionary。 SKAction用于播放声音。 一切正常,除了...应用程序在使用以下堆栈跟踪进入背景时崩溃: * thread #1: tid = 0x187d7, 0x3461b932 libGPUSupportMercury.dylib`gpus_ReturnNotPermittedKillClient + 10, queue = 'com.apple.spritekit.renderQueue, stop reason = EXC_BAD_ACCESS (code=1, address=0x1) frame #0: 0x3461b932 libGPUSupportMercury.dylib`gpus_ReturnNotPermittedKillClient + 10 frame #1: 0x3461c3d0 libGPUSupportMercury.dylib`gpusSubmitDataBuffers + 104 frame #2: 0x2eafc4a4 IMGSGX554GLDriver`SubmitPackets + 124 frame #3: 0x31f83cb0 GLEngine`gliPresentViewES + 168 frame #4: 0x31f8e136
  • AVAudioRecorder记录AAC / m4a(AVAudioRecorder record AAC/m4a)
    问题 我正在尝试使用AVAudioRecorder在设备上录制音频。 该文件被传输到Web服务器,我想在Web浏览器中播放结果文件。 我尝试了设备上各种设置的组合...似乎没有任何文件可以将文件编码为正确的AAC格式。 QuickTime表示它不知道如何播放此文件。 样例代码 private void InitializeRecordingSession() { string fileName = string.Format("{0}.m4a", Guid.NewGuid()); string tmpdir = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + "/audio"; if (!Directory.Exists(tmpdir)) Directory.CreateDirectory(tmpdir); audioFilePath = Path.Combine(tmpdir, fileName); Console.WriteLine("Audio File Path: " + audioFilePath); var url = NSUrl.FromFilename(audioFilePath); var settings = new AVAudioRecorderSettings() {
  • iOS音频掌柜-- AVAudioSession
    音频输出作为硬件资源,对于iOS系统来说是唯一的,那么要如何协调和各个App之间对这个稀缺的硬件持有关系呢? iOS给出的解决方案是"AVAudioSession" ,通过它可以实现对App当前上下文音频资源的控制,比如 插拔耳机、接电话、是否和其他音频数据混音等。当你遇到: 是进行录音还是播放?当系统静音键按下时该如何表现?是从扬声器还是从听筒里面播放声音?插拔耳机后如何表现?来电话/闹钟响了后如何表现?其他音频App启动后如何表现?... 这些场景的时候,就可以考虑一下“AVAudioSession”了。 ������ 在很久以前(其实也是不是太久--iOS7以前)还有个AudioSession的存在,其功能与AVAudioSession类似,但是在iOS7 以后就已经被标记为 “Not Applicable”,所以如果Google到了说AudioSession的内容而不是用的AVAudioSession,那么就可以直接PASS了,当然如果要兼容iOS6 就另当别论了,不过现在QQ/微信都是要求iOS7的情况下,是否需要兼容iOS6就看老板们的意思吧。 Session默认行为 可以进行播放,但是不能进行录制。当用户将手机上的静音拨片拨到“静音”状态时,此时如果正在播放音频,那么播放内容会被静音。当用户按了手机的锁屏键或者手机自动锁屏了,此时如果正在播放音频
  • 设置 AVAudioSession Category 对来自 WKWebView 的声音没有影响(Setting AVAudioSession Category has no effect on sound from WKWebView)
    问题 当从 WKWebView 播放音频时,我似乎无法覆盖 AVAudioSession 类别或端口。 使用普通 UIWebView 时,相同的代码可以完美运行。 AVAudioSession *session = [AVAudioSession sharedInstance]; [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&err]; 我也试过像这样激活sharedInstance ,但它没有帮助: [session setActive: YES error: nil]; 上面的代码对来自 WKWebView 的音频没有影响。 我确实在 Twitter 上发现了一些关于 iOS 8.1 正在将 WKWebView 音频与后台应用程序音频混合的报道,但我找不到它的来源。 请参阅此推特线程以供参考:https://twitter.com/marcoarment/status/530881842900373504 回答1 因此,显然 WKWebView 在与您的应用程序不同的进程中运行。 这可能意味着,它也有与您的应用程序的 AudioSession 分开的自己的 AudioSession。 这就是为什么更改您的应用程序的 AudioSession 不会影响 webView。 以及为什么它与
  • 切换 avaudiosession 类别然后重新控制远程控制中心控件(Switching avaudiosession categories then retaking control of remote control center controls)
    问题 这是我第一次发帖问一个问题,因为我通常不需要帮助,但我不知道这是否可能。 我需要的是在这两种类型的 avaudiosession 之间切换,当从允许混音切换到不混音时,应用程序收回控制中心遥控器的控制权。 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers 错误:nil] 和 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:nil error:nil] 我会尝试解释发生了什么: 它们都独立工作,所以如果我从第一个 avaudiosession 配置开始,它允许混合并将控制中心的遥控器正确切换到 iPod。 如果我启动第二个 avaudiosession 配置,应用程序会正确控制控制中心的遥控器。 当我尝试切换这些选项时会出现问题。 关闭混音后,当我切换应用程序时,不会重新控制遥控器。 任何帮助将不胜感激 回答1 我找到了一个适合我的解决方案,其中涉及调用 [[UIApplication sharedApplication]
  • 如何使用 kAudioSessionProperty_OverrideCategoryMixWithOthers(How to use kAudioSessionProperty_OverrideCategoryMixWithOthers)
    问题 我想让我的虚拟乐器应用程序在后台运行时能够被使用(通过 MIDI 键盘)。 通过将UIBackgroundModes设置为“ audio”,并将AudioSessions的类别设置为AVAudioSessionCategoryPlayback,可以很好地工作。 此外,为了允许与音乐播放器应用程序混合,我设置了属性kAudioSessionProperty_OverrideCategoryMixWithOthers。 为了节省电池能量,建议用户在不需要时关闭后台操作。 因此,我的应用程序中有一个切换,可以在类别AVAudioSessionCategoryAmbient和类别AVAudioSessionCategoryPlayback(带有kAudioSessionProperty_OverrideCategoryMixWithOthers)之间进行切换。 代码是这样的(省略错误处理): NSString *category = supportsBackgroundOperation ? AVAudioSessionCategoryPlayback : AVAudioSessionCategoryAmbient; [session setCategory:category error:nil]; if (category ==
  • SpriteKit-多任务的正确方法(SpriteKit- the right way to multitask)
    问题 我尝试在代码中的所有位置进行搜索:解释了文档的背景信息,或者它在某个时间甚至被暂停,但无济于事-有人可以按照建议的方式引导我进入背景信息系统。精灵套件启用的游戏? 我应该只打电话给scene.paused = YES ,还是要如何确认背景中没有绘画,所以我可以避免被iOS终止而不允许这样做? 谢谢! 回答1 SpriteKit确实还没有被很好地记录,可能是因为它是如此新,以至于很少有开发人员实现了它。 SpriteKit应该在后台运行时暂停动画,但是根据我的经验(和harrym17的经验),它将导致内存访问错误并完全退出应用程序而不是后台运行。 根据Apple开发者论坛的说法,这似乎是SpriteKit中的一个已知错误(在后台运行时,它并不总是暂停动画,因为应该这样做),根据harrym17的评论会导致内存访问错误。 这是一个对我有用的简短修复程序-我的应用程序在后台运行时始终崩溃,并且由于添加了此代码,所以一切正常。 (对于Keith Murray在Apple论坛上获取此代码表示敬意;据我所知,他还没有将其发布在SO上)。 在AppDelegate.h ,确保导入SpriteKit: #import <SpriteKit/SpriteKit.h> 在AppDelegate.m ,编辑applicationWillResignActive方法: - (void