前言:我正在构建一个闹钟应用程序.许多其他警报应用程序(如闹钟专业版)能够在屏幕锁定且应用程序位于前台时播放警报.它们的警报可以无限制地播放,并且可以使用系统音量逐渐增加音量.他们也没有控制音乐控件(如果你打开多任务屏幕并滚动播放音频,你将看不到他们的图标)
我在复制该功能时遇到了一些麻烦.
要在应用程序位于前台时播放警报,我们会触发本地通知,效果很好.屏幕锁定时,我的成功有限(应用程序处于非活动状态)
我使用了以下方法:
NSTimer屏幕锁定时,每秒运行一次后台任务.我设法保持应用程序打开超过10分钟,但我无法播放声音.什么时候到来
使用播放1秒静音AVAudioPlayer.当声音结束时,重播声音并检查应用程序是否处于非活动(锁定屏幕)状态.如果它处于锁定屏幕状态并且是时候播放闹钟,请播放它.这里的问题是我必须使用
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
为了在后台继续更新歌曲.该方法将在音乐控件中显示Wake,并将停止我们想要避免的任何当前播放的音乐.
已经帮助但尚未解决我的问题的相关知识:
摘要:当屏幕被锁定且应用程序位于前台时,我无法阻止该过程在10分钟后被杀死.
UPDATE
我最终使用了https://github.com/mruegenberg/MMPDeepSleepPreventer,让我在10分钟后播放声音.然而,这就像疯了一样吃掉电池.我需要找到一个更有效的解决方案.
更新2
我从应用程序商店下载了一些http://marcopeluso.com/应用程序.他是Deep Sleep Preventer的创造者.我下载了他的一些应用程序,并进行了一些仪器测试,看到他的应用程序没有像我的应用程序一样耗尽电池(他的博客上某处声称每小时大约2.5%).我非常肯定我需要优化我的应用程序,电池耗尽问题将消失,我的问题将得到解决!
更新3 我最终使用https://github.com/mruegenberg/MMPDeepSleepPreventer
我在它自己独立的xCode项目中运行它,当应用程序在后台时它只使用0.5%的cpu.事实证明这是我的应用程序吸吮CPU.所以它现在运作良好:)
我正在尝试构建类似于当前在应用程序商店中的闹钟专业版和床头柜应用程序的闹钟.当闹钟时间被击中时(通常是第二天早晨),这些应用程序中的每一个都能够播放超过30秒的闹钟声音.
我已经尝试过两种没有运气的方法:
方法1:
[self performSelector:@selector(playAlarm) withObject:nil afterDelay:myDouble];
Run Code Online (Sandbox Code Playgroud)
方法2:
UILocalNotification *notif = [[cls alloc] init];
notif.fireDate =[datePicker date];//firedate;
notif.timeZone = [NSTimeZone systemTimeZone];
notif.alertBody = @"Time to wake up!";
NSString *SoundFileName=nil;
if([[[NSUserDefaults standardUserDefaults] objectForKey:@"ActualSoundFile"] isKindOfClass:[NSString class]])
SoundFileName=[[[NSString alloc]initWithString:[[NSUserDefaults standardUserDefaults]objectForKey:@"ActualSoundFile"]]autorelease];
else
SoundFileName=[[[NSString alloc] initWithString:@""] autorelease];
if([SoundFileName length]>1)
notif.soundName = [SoundFileName stringByAppendingString:@".wav"];
else
notif.soundName = UILocalNotificationDefaultSoundName;
notif.alertAction=@"Snooze";
notif.repeatCalendar=[NSCalendar currentCalendar];
notif.repeatInterval =NSDayCalendarUnit;
NSDictionary *userDict = [NSDictionary dictionaryWithObject:@"Alarm" forKey:kRemindMeNotificationDataKey];
notif.userInfo = userDict;
[[UIApplication sharedApplication] scheduleLocalNotification:notif];
[notif release];
Run Code Online (Sandbox Code Playgroud)
有谁知道他们如何在7小时后在循环中播放闹钟?
我正在研究收音机闹钟,我有一些问题.我正在使用警报的本地通知,因此如果应用程序未运行,它会有轻微的后备.
我很清楚设备的局限性,我知道当设备进入后台时我能做什么,不能做什么.
但我的问题是:当我锁定设备时,我已经看到其他应用程序启动音频流.这怎么可能?可以在执行时间范围内吗?
实现这个的最佳方法是什么?是否可以在设备锁定时激活流媒体会话?
编辑
澄清:我知道如何在后台播放音频.但问题是当本地通知或其他事件触发时触发音频播放.
一个似乎这样做的应用程序是Radio Alarm Clock.我还没有尝试过很长一段时间.但似乎这样做.该应用的视频演示:http://www.youtube.com/watch?v = KJQiFOcdBWk
我正在尝试构建自定义警报应用程序.但我面临的挑战是在应用程序处于后台时播放声音.
第一种方法,UILocalNotification,
根据Apple编程指南,发出警报的正确方法是
- (void)scheduleAlarmForDate:(NSDate*)theDate
{
UIApplication* app = [UIApplication sharedApplication];
NSArray* oldNotifications = [app scheduledLocalNotifications];
// Clear out the old notification before scheduling a new one.
if ([oldNotifications count] > 0)
[app cancelAllLocalNotifications];
// Create a new notification.
UILocalNotification* alarm = [[UILocalNotification alloc] init];
if (alarm)
{
alarm.fireDate = theDate;
alarm.timeZone = [NSTimeZone defaultTimeZone];
alarm.repeatInterval = 0;
alarm.soundName = @"alarmsound.caf";
alarm.alertBody = @"Time to wake up!";
[app scheduleLocalNotification:alarm];
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,
如果用户手机处于静音状态,则通知声音只会是一个不足以发出警报的小振动.
理想情况下,无论电话处于静音还是正常状态,我都希望警报能够响起,以唤醒用户.
我能想到的第二种方式,AVAudioSession
除了以上两种方法都不起作用外,我似乎找不到任何其他方法来解决手头的问题. …
作为主题......有可能吗?
谢谢
再次,我附上了如下代码,请检查哪一步是错误的.谢谢.
//@step
AudioSessionInitialize (NULL, NULL, NULL, NULL);
AudioSessionSetActive(true);
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
OSStatus error = AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof(sessionCategory),&sessionCategory);
if (error)
printf("ERROR AudioSessionSetProperty ! %d\n", error);
//@step
NSString* filePath = @"AlarmClockBell.caf";
[Util restoreResourceFile:filePath];
filePath =[Util getFileFullPathFromSysDoc:filePath];
NSURL *soundFileURL = [NSURL fileURLWithPath:filePath];
NSError* error ;
AVAudioPlayer * audioPalyer = [[AVAudioPlayer alloc] initWithContentsOfURL: soundFileURL error: &error];
if (nil == audioPalyer)
{
AppTrace3(self, @"Faild to play", soundFileURL, error);
return FALSE;
}
[audioPalyer prepareToPlay];
[audioPalyer setVolume: 5 ];
[audioPalyer setDelegate: self];
audioPalyer.numberOfLoops = …Run Code Online (Sandbox Code Playgroud) 我有一段代码,我在那里拨打服务器电话,并根据响应播放声音.现在,当我的应用程序处于后台或我的设备被锁定时,这不起作用.
有没有办法我们可以执行这段代码(服务器调用和响应处理),即使应用程序在后台或设备被锁定?
ios ×5
iphone ×5
objective-c ×3
alarm ×2
background ×1
cocoa-touch ×1
ios8 ×1
locked ×1
screen ×1