单击后退按钮iOS 6时如何继续播放音频

Posted

技术标签:

【中文标题】单击后退按钮iOS 6时如何继续播放音频【英文标题】:How to keep playing audio when clicking back button iOS 6 【发布时间】:2014-05-13 05:09:00 【问题描述】:

我正在使用 XCode 4.5 for ios 6 开发一个广播流应用程序,主要使用情节提要。在登录视图之后,它将显示一个标签栏控制器,该控制器由 3 个标签组成:频道列表、关于、新闻。登录后默认打开频道列表选项卡,显示广播频道列表(我正在使用 uitableview 填充列表)。然后单击一个频道将带您进入另一个视图控制器(在同一选项卡菜单中),显示“正在播放”视图,您需要在该视图中点击播放按钮来启动流媒体。

在这里,我正在实现 Matt Gallagher 的音频流媒体。我已经在我的 Info.plist 中添加了“必需的背景模式”键和值“应用程序播放音频”。我还在我的 appDelegate 的 didFinishLaunchinWithOptions: 方法中添加了以下代码

UIDevice *thisDevice = [UIDevice currentDevice];
if([thisDevice respondsToSelector:@selector(isMultitaskingSupported)]
   && thisDevice.multitaskingSupported)

    __block UIBackgroundTaskIdentifier backgroundTask = [application beginBackgroundTaskWithExpirationHandler:^
        /* just fail if this happens. */
        NSLog(@"BackgroundTask Expiration Handler is called");
        [application endBackgroundTask:backgroundTask];
    ];

到目前为止,我在模拟器中运行它,选择其中一个频道后,点击“正在播放”视图中的播放按钮,即使我移动到“关于”或“新闻”选项卡,它仍会播放音频。当我单击主页时,它也没有问题。 我的问题是,当我单击“正在播放”视图上方的导航栏的“后退”按钮(意味着返回频道列表),或者当我单击最上方的返回按钮(意味着返回登录视图)时,音频停止播放。当我尝试打开同一个频道时,它不会恢复流式传输,我需要单击播放按钮重新开始。

我怎样才能做到这一点,只要用户登录,当导航回频道列表或登录视图时,音频就会继续播放(除非用户点击不同的频道)? 我猜这与 UITableView 有关,比如保持选定单元格的状态。但我不知道该怎么做。所以,谢谢你的帮助:)

【问题讨论】:

这与您显示的代码无关。如果播放停止,大概是因为当您返回时,视图控制器不存在,播放器也随之不存在。你把你的播放器放在了错误的地方,仅此而已。它需要在应用程序委托中,以便它可以始终存在。 @matt 我按照你的建议编辑了我的问题,请检查:) 不要改变你的问题来问一个完全不相关的问题。我回答了你提出的问题,我的回答似乎有所帮助。对于不同的问题,请提出新问题。 @matt 好的,对不起。我自己才意识到这一点。谢谢提醒:) 【参考方案1】:

所以,我按照@matt 的建议将音频流媒体放入 appDelegate。我将以下代码从 Now Playing 视图控制器移动到我的 appDelegate.m 文件

#pragma mark - audio streamer

- (void)playAudio:(indoRadio *)np withButton:(NSString *)currentButton

    if ([currentButton isEqual:@"playbutton.png"])
    
        [self.nowplayingVC.downloadSourceField resignFirstResponder];

        [self createStreamer:np.URL];
        [self.nowplayingVC setButtonImageNamed:@"loadingbutton.png"];
        [audioStreamer start];
    
    else
    
        [audioStreamer stop];
    


- (void)createStreamer:(NSString *)url

    if (audioStreamer)
    
        return;
    

    [self destroyStreamer];

    NSString *escapedValue = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(nil,(CFStringRef)url,NULL,NULL,kCFStringEncodingUTF8);

    NSURL *streamurl = [NSURL URLWithString:escapedValue];
    audioStreamer = [[AudioStreamer alloc] initWithURL:streamurl];

    [[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(playbackStateChanged:)
     name:ASStatusChangedNotification
     object:audioStreamer];


- (void)playbackStateChanged:(NSNotification *)aNotification

    if ([audioStreamer isWaiting])
    
        [self.radioDetailVC setButtonImageNamed:@"loadingbutton.png"];
    
    else if ([audioStreamer isPlaying])
    
        [self.nowplayingVC setButtonImageNamed:@"stopbutton.png"];
    
    else if ([audioStreamer isIdle])
    
        [self destroyStreamer];
        [self.nowplayingVC setButtonImageNamed:@"playbutton.png"];
    


- (void)destroyStreamer

    if (audioStreamer)
    
        [[NSNotificationCenter defaultCenter]
         removeObserver:self
         name:ASStatusChangedNotification
         object:audioStreamer];

        [audioStreamer stop];
        audioStreamer = nil;
    

当我点击播放按钮时,音频流媒体在后台运行良好。无论我在应用程序内外走到哪里,它仍在播放。

【讨论】:

以上是关于单击后退按钮iOS 6时如何继续播放音频的主要内容,如果未能解决你的问题,请参考以下文章

正在播放当前音频以及如何在单击同一按钮时暂停所有其他音频

在android的listview中实现音频播放器

单击时播放音频文件的按钮[重复]

iOS Swift 在视图关闭时停止 MoviePlayer

如何添加它,以便在单击按钮时播放 html 中的音频文件

单击按钮时的音频播放问题