如何在iPhone锁屏状态下开始播放音乐

4
我正在使用UILocalNotification来提醒用户,如果应用程序没有运行,则使用MPMusicPlayerController播放iPod音乐,并使用MPMoviePlayerController播放广播流URL。

根据Apple文档: 如果iPhone被锁定并且设备接收到本地通知,则会播放30秒的声音,当用户滑动滑块时,它将把应用程序带到前台,并发生两种情况
  1. 如果应用程序未运行,则调用方法

    (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

  2. 如果应用程序已在运行,则调用方法-

    (void)application:(UIApplication *)app didReceiveLocalNotification:(UILocalNotification *)notify

我可以在这些方法中执行我的任务。

问题: 当iPhone被锁定并且本地通知接收到并且应用程序在前台运行时,我需要我的应用程序能够播放我的声音(它可能是iPod音乐或流媒体URL,但不是30秒的本地通知声音)。
参考应用: “闹钟HD”和其他应用程序也可在此方式下正常工作,但这些应用程序无法在后台运行时播放闹钟(我无法理解为什么???)
我也尝试了如何防止iPhone进入深度睡眠
这会定期播放静音音乐以防止iPhone进入深度睡眠,但是如何通知应用程序已收到通知以开始播放“实际音乐”? 如何开始播放新音乐?

@DineshPatel 我知道我可以使用播放器来播放音频,实际上我正在使用它,但问题是当屏幕锁定时,我无法控制我的应用程序,那么如何通知应用程序已收到通知,以便应用程序开始播放音频。 - Archive
嗨,Manju,你找到解决问题的方法了吗?如果是,能否建议我一下,我该怎么做。 - Hindu
2个回答

5

@manju抱歉我回复晚了,但是它对你有用。

 selectedDate = [timePicker date];

如果你选择了日期对象selectedDate,那么通知将在该日期到达时触发。
[NSDate date]可以获取当前时间。你可以通过比较两个时间来计算它们之间的差异。

 NSTimeInterval timeDifference =  [ selectedDate timeIntervalSinceDate:[NSDate date]];   

现在当您安排通知时,请编写以下代码:

现在当您安排通知时,请编写以下代码

 UIApplication *app = [UIApplication sharedApplication];
 UIBackgroundTaskIdentifier bgTask = 0;

 NSTimer  *backgroundTimer = [NSTimer scheduledTimerWithTimeInterval:timeDifference    target:self  selector:@selector(backgroundTask) userInfo:nil repeats:NO];


    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:bgTask];
    }];

    -(void)backgroundTask
    {
        NSLog(@"Here you can play song via player ");
       }

不要忘记添加到app.infolist

UIApplication后台模式-音频,它将解决您的问题,在设备锁定时播放歌曲。


-(void)backgroundTask 在后台收到通知时调用,但我已经编写了一段使用 AVAudioplayer 播放音频的代码片段,在前台可以播放音频,但在后台无法播放。我已经在 plist 中设置了“需要后台模式”为“播放音频”。 - Archive
我的代码- -(void)backgroundTask { NSLog(@"在这里你可以通过播放器播放歌曲"); NSURL *audioFileLocationURL = [[NSBundle mainBundle] URLForResource:@"HeadspinLong" withExtension:@"caf"]; NSError *error=nil; delegate.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:audioFileLocationURL error:&error]; [delegate.audioPlayer setNumberOfLoops:-1]; [delegate.audioPlayer prepareToPlay]; [delegate.audioPlayer play]; } 在前台它会打印日志并开始播放音频,但在后台它只显示日志,不播放音频。 - Archive
嗨Dinesh,我和Manju一样遇到了同样的问题,日志打印但音乐无法在后台播放。 - Hindu

2

在音频会话中使用AVAudioSessionCategoryPlayback。请在此处查看音频会话编程指南。


我已经看过这个链接,但不知道如何通知应用程序收到了通知,以便开始播放音乐。 - Archive
如何在锁定屏幕时调用(void)application:(UIApplication *)app didReceiveLocalNotification:(UILocalNotification *)notify方法而无需滑动滑块。 - Archive
我认为你的问题是如何在锁定屏幕时播放音乐? - Sagrian
我是iOS的新手,很抱歉无法澄清我的问题。实际上,当应用程序在前台运行并且iPhone被锁定时,我想要在收到UILocalNotification时播放音乐(从iPod库和流媒体URL)。就像闹钟一样。 - Archive

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接