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

时间:2014-05-13 05:09:01

标签: ios objective-c uitableview audio

我正在开发一款适用于iOS 6的XCode 4.5的无线电流媒体应用程序,主要使用故事板。在登录视图之后,它将显示一个标签栏控制器,它由3个标签组成:频道列表,关于,新闻。登录后默认打开“频道列表”选项卡,显示无线电频道列表(我使用uitableview填充列表)。然后单击一个通道将带您进入另一个视图控制器(在同一选项卡菜单中),显示正在播放视图,您需要点击播放按钮以启动流光。

这里我正在实施Matt Gallagher的音频流。我已在Info.plist中添加了“必需的后台模式”键和值“App播放音频”。我还在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];
    }];
}

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

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

1 个答案:

答案 0 :(得分:0)

所以,我遵循了@matt关于将音频流媒体放入appDelegate的建议。我将以下代码从正在播放视图控制器移动到我的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;
    }
}

单击播放按钮时,音频流在后台运行良好。无论我在应用程序的内部和外部,它仍在播放。