应用程序进入后台时暂停音频

Posted

技术标签:

【中文标题】应用程序进入后台时暂停音频【英文标题】:Pausing Audio when App Goes to the Background 【发布时间】:2014-05-07 05:53:09 【问题描述】:

当应用程序将退出活动状态时,我有一个通知设置来提醒我的 VC:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(pauseGame)
                                             name:UIApplicationWillResignActiveNotification
                                           object:[UIApplication sharedApplication]];

如您所见,它调用了一个名为 pauseGame 的方法。 该方法包括:

[audio pauseAudio];

我在应用程序中使用相同的方法暂停,一切正常。

当应用程序被发送到后台时,此方法被正确调用,但是,当应用程序恢复时,音频继续播放。其他暂停项目正在恢复,因此该方法正在完成。

如何让音频在进入后台时正确暂停?

更新:人们一直在提到 ApplicationDidEnterBackGroundNotification。我试过了,但它的工作原理是一样的。需要注意的是,Apple 在自己的 cmets 中的 AppDelegate 推荐了我原来使用的方法。有关他们在代表中预先放置的评论,请参见下文。

    - (void)applicationWillResignActive:(UIApplication *)application

    // 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.

更新 2:例如,当有来电时,使用 WillResignActive 可以正确暂停。通过该事件,音频会正确停止。因此,当按下主页按钮时,似乎只是应用程序进入后台。来电不会调用后台通知,因此显然呼叫和家庭按下会导致不同的状态。

【问题讨论】:

感谢您对格式的修改。 尝试使用“UIApplicationDidEnterBackgroundNotification” - 像这样:[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pauseGame) name:UIApplicationDidEnterBackgroundNotification object:nil]; 与使用我上面发布的辞职声明相同的问题。 【参考方案1】:
    - (void)applicationDidEnterBackground:(UIApplication *)application
 
   /*
   Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
 If your application supports background execution, called instead of applicationWillTerminate: when the user quits.
   */
    NSLog(@"Application moving to background");
  // Here Call your notification for pause  audio

https://developer.apple.com/library/ios/documentation/uikit/reference/UIApplicationDelegate_Protocol/Reference/Reference.html

【讨论】:

AppDelegate 文件中苹果自己的 cmets 推荐使用我在原帖中做的方法。但是,我尝试了后台方法,但效果并不好。【参考方案2】:

就这样试试吧……

 -(void)applicationDidEnterBackground:(UIApplication *)application
     

    bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^

            [[UIApplication sharedApplication] endBackgroundTask:bgTask];
        ];

    

同时在 Appdelegate.h 上声明 bgTask

UIBackgroundTaskIdentifier bgTask;

这里你只要把 NSNotifcation Center 改成

[[NSNotificationCenter defaultCenter] addObserver: self
                                                 selector: @selector(pauseGame)
                                                     name: UIApplicationDidEnterBackgroundNotification
                                                   object: nil];

。希望这会对你有所帮助....

【讨论】:

不幸的是,这并不能解决问题。和我原来的帖子一样的问题。【参考方案3】:

写在你的viewDidLoad:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pausePlayer) name:UIApplicationDidEnterBackgroundNotification object:nil];

并添加一个新方法:

-(void)pausePlayer
    [audio pauseAudio];

有很多不同的通知,请查看UIApplication.h

【讨论】:

我已经在我发布的内容中几乎完全做到了这一点。将通知更改为后台会产生与我上面描述的相同的问题。【参考方案4】:

我发现停止音频与暂停音频可以解决问题。有趣的是,停止在恢复时不会重新开始音频,而是会从中断的地方开始。通过这种方式,停止与暂停一样工作并满足我的需求。

【讨论】:

【参考方案5】:

我知道这是一个古老的问题,但我刚刚找到了解决同一问题的方法(iOS 11 仍然存在于 2018 年,我假设是 iOS 12):

注册AVAudioSessionInterruptionNotification:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(avAudioSessionInterruptionNotification:) name:AVAudioSessionInterruptionNotification object:nil];

当您的申请恢复后,您会收到此通知。当您恢复应用程序时,您会被告知中断开始,然后立即被告知中断结束。如果您的音频正在播放,您将在“开始”处理程序中暂停它。那么“结束”消息将没有“恢复”值,所以你应该停止你的音频。这是我的代码:

- (void) avAudioSessionInterruptionNotification:(NSNotification *)notification
    
    AVAudioSessionInterruptionType type = [notification.userInfo[AVAudioSessionInterruptionTypeKey] intValue];
    if ( type == AVAudioSessionInterruptionTypeBegan )
        
        // If your audio is active, pause it here.
        
    else if ( type == AVAudioSessionInterruptionTypeEnded )
        
        AVAudioSessionInterruptionOptions optionsValue = [notification.userInfo[AVAudioSessionInterruptionOptionKey] intValue];
        if ( optionsValue == AVAudioSessionInterruptionOptionShouldResume )
            
            // Resume your audio here
            
        else
            
            // Stop your audio here
            
        
    

【讨论】:

以上是关于应用程序进入后台时暂停音频的主要内容,如果未能解决你的问题,请参考以下文章

WKWebView 在后台应用程序时停止音频

当应用程序进入后台时暂停和恢复 UIView 动画

当应用程序进入暂停状态时取消本地通知。(从后台删除)

当 iOS 应用程序进入后台时,是不是会暂停冗长的任务?

应用程序进入后台时播放音频

当应用程序进入后台时开始播放音频文件