如何像闹钟专业应用程序一样播放超过 30 秒的闹钟声音?

Posted

技术标签:

【中文标题】如何像闹钟专业应用程序一样播放超过 30 秒的闹钟声音?【英文标题】:how do I play an alarm sound for more than 30 seconds like the alarm clock pro app? 【发布时间】:2011-07-01 04:55:08 【问题描述】:

我正在尝试构建一个类似于当前在应用商店中的 Alarm Clock Pro 和 Nightstand 应用程序的闹钟。当到达闹钟时间(通常是第二天早上)时,这些应用程序中的每一个都能够播放超过 30 秒的闹钟声音。

我已经尝试了两种方法,但都没有成功:

方法一:

[self performSelector:@selector(playAlarm) withObject:nil afterDelay:myDouble];

方法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];

有谁知道他们如何能够在 7 小时后循环播放闹钟?

【问题讨论】:

对于方法 2,这就是您的全部代码吗?在这一行之后你肯定需要更多代码。 @Ben - 刚刚添加了这两种方法。 【参考方案1】:

选择的答案不是正确答案,因为用户可能会在第一次通知期间醒来并选择关闭它。你猜怎么着,第二个通知的出现给用户一种警报被打破的印象。

根据App docs的正确答案如下:

当您的应用在后台(例如,用户在睡觉前关闭应用)时,当您的通知到达时,您不能播放超过 30 秒的声音。

要播放更长的声音,您必须告诉您的用户在睡觉前将闹钟应用程序留在前台,然后在 didReceiveLocalNotification 中手动实现播放更长的声音。

【讨论】:

这是不正确的。您可以以 30 秒的间隔连续执行任意多次相同的声音。编写应用程序的人需要清除用户参与后设置的所有后续通知。 当您的应用程序终止或在后台暂停时系统显示您的通知时,有两个选项:“关闭”和另一个按钮。点击关闭按钮不会通知您的应用程序,因此您无法像您说的那样清除任何后续通知。因此,即使用户每次都选择关闭,用户仍将继续收到您安排的 30 秒警报。在我看来,这对用户来说是一种非常混乱的体验。 您可以在执行时将用户带回您的应用程序:[[UIApplication sharedApplication] cancelAllLocalNotifications]; 在用户点击 UILocalNotificationPopup 中的关闭按钮后,如何将用户带回您的应用? 您阅读了您发布的链接吗?它说要返回应用程序,您必须点击查看按钮。我们在这里谈论关闭按钮。如果用户从本地通知弹出窗口中点击关闭,您将无法返回应用程序。【参考方案2】:

您需要通过将日期分配给 fireDate 属性来触发本地通知,并将声音文件分配给

UILocalNotification *localNotif = [[[UILocalNotification alloc] init]autorelease];
localNotif.fireDate = scheduleDate;
NSLog(@"fireDate is %@",localNotif.fireDate);
localNotif.timeZone = [NSTimeZone defaultTimeZone];
localNotif.alertBody = @"WAKE UP...!!!";
localNotif.alertAction = @"View";
localNotif.soundName = @"Default.wav";


[[UIApplication sharedApplication] scheduleLocalNotification:localNotif];

这样,即使应用程序关闭,本地通知也会被触发,记住“Default.wav”文件应该小于或等于30秒,即使闹钟专业应用程序在本地通知中播放声音=30秒。

如果应用程序处于活动状态,您可以实现 appdelegate 的委托方法,并且可以应用您的逻辑来显示警报视图并播放声音甚至超过 30 秒.....

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
 

【讨论】:

如何保持应用程序“活跃”?当我让我的应用程序运行并进入睡眠状态时,声音只播放 30 秒。闹钟应用会一直播放声音,直到我真正醒来并执行用户操作。【参考方案3】:

所以我想我找到了一个有效的解决方案:

要模拟播放超过 30 秒的警报声,只需一个接一个地添加多个本地通知,间隔 30 秒即可。

【讨论】:

这不是正确答案,因为用户可能会在第一次通知期间醒来并选择关闭它。你猜怎么着,第二个通知的出现给用户一种警报被打破的印象。 这需要由应用程序处理。选择警报后,您需要取消所有其他本地通知 这不是 @MyCSharpCorner 和 Hardik Shah 已经说过的正确答案。 daSnOwie 如果您进行研究,可能警报不会弹出通知窗口。或者,如果他们这样做了,而您会忽略通知,而不是接受它,则应用程序将永远没有机会运行。我[也对此有所了解。] (***.com/questions/9725192/…)

以上是关于如何像闹钟专业应用程序一样播放超过 30 秒的闹钟声音?的主要内容,如果未能解决你的问题,请参考以下文章

ios如何设置闹钟?

怎么用易语言做一个闹钟,就是怎么实现到了某个时间,程序播放设定铃声的

带定时器的闹钟?

iOS:App停用后闹钟App如何播放声音?

如何避免超过闹钟时间触发闹钟?

如何在android中的指定时间播放闹钟?