UILocalNotification 声音不会停止播放

Posted

技术标签:

【中文标题】UILocalNotification 声音不会停止播放【英文标题】:The UILocalNotification sound does not stop playing 【发布时间】:2014-07-02 09:37:00 【问题描述】:

我已将自定义 .aif 30 秒文件设置为本地通知声音名称。下面是我安排本地通知的代码。

//Function to schedule local notification
-(void)schedulelocalnotification:(NSDate *)particularfiredate ringtone: (NSString *)particularringtone name:(NSString *)alarmname info:(NSDictionary *)dicttext

UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.fireDate = particularfiredate;
notification.soundName = [arrayAIFFFiles objectAtIndex:[arraysoundfilesnames indexOfObject:particularringtone]];
notification.alertBody = alarmname;
notification.userInfo = dicttext;

[[UIApplication sharedApplication] scheduleLocalNotification:notification];

但是当设备被锁定,并且用户在通知上滑动进入应用程序时,即使用户进入应用程序,声音也会继续播放。即使用户退出/卸载应用程序,它也会继续播放。 请提出可能的原因。

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


    [[NSUserDefaults standardUserDefaults] setValue:@"0" forKey:@"demo"];
    NSLog(@"%i",[[[UIApplication sharedApplication] scheduledLocalNotifications] count]);
    NSString *viewcontrollerstring = [notification.userInfo objectForKey:@"smiletosnooze"];
    NSLog(@"++++++------%@",viewcontrollerstring);



PS:我检查了 - UILocalNotification stop sound after notification is dismissed 和这个 - Stop UILocalNotification Sound on slide to view 但它没有帮助。 :(

【问题讨论】:

似乎有一个已提交的错误报告...openradar.appspot.com/15901634 如果您按下设备的任何硬件音量按钮,声音会停止吗? 是的,当按下设备硬件音量按钮时声音会停止。那么现在,如果有错误报告,这是否意味着没有解决方法?我可以看到很少有应用程序正在这样做 - itunes.apple.com/en/app/alarm-clock-hd-free/id382604920?mt=8 他们做得如何? 还有一个问题:这种行为是否会根据 iPhone 是否被密码锁定而改变? 是的,我刚刚测试了应用密码,当密码锁定打开时,通知声音在滑动时停止。 【参考方案1】:

这似乎是提交给here 的ios 7 的一个未解决的错误。当设备被密码锁定时,似乎也不会出现此问题。对我有用的一个非常丑陋的技巧是为应用程序徽章编号设置一个值,并在应用程序进入前台时立即将其删除。示例代码是:

- (void)applicationWillEnterForeground:(UIApplication *)application

    [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 1];
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];


编辑

显然,上面提到的 hack 实际上不适用于 iOS 7.1+。我发现的唯一解决方法如下,但我很犹豫是否将其称为实际答案:

- (void)applicationWillEnterForeground:(UIApplication *)application

   AVAudioSession *session = [AVAudioSession sharedInstance];
   [session setCategory:AVAudioSessionCategoryPlayback error:nil];
   [session setActive:YES error:nil];
   MPMusicPlayerController *musicPlayer = [MPMusicPlayerController applicationMusicPlayer];
    [musicPlayer setVolume:0.0f]; 

但是上面的代码有很多严重的缺陷:

    setVolume 方法自 iOS 7 起已弃用(尽管显然许多应用仍在使用它) 您需要在应用程序的某个时间点将音量重新设置为适当的(非零级别) 设置音量属性肯定会对可能同时播放声音或音乐的其他应用产生副作用

2014 年 9 月 18 日更新

这个问题似乎在 iOS 8 上得到了解决。

【讨论】:

试过这个,但不起作用。声音仍然持续播放到 30 秒,即 EOF。 @ScarletWitch 是的,你是对的,它在 iOS 7.1+ 上不起作用...检查我上面的编辑以获取“解决方法” 感谢@spassas 的及时回复和努力,但它仍然不起作用:( 设备声音已静音(从出现的图标中可以看出),但声音仍在继续。 @ScarletWitch 奇怪,它似乎在我运行 iOS 7.1.1 的 iPhone 4S 上运行良好。我添加了几行来配置AVAudioSession。我必须承认,我现在想不出别的了:) 非常感谢,@spassas,现在可以使用了。虽然声音的水印不断出现,但它的工作原理。 (y)

以上是关于UILocalNotification 声音不会停止播放的主要内容,如果未能解决你的问题,请参考以下文章

结合声音和 UILocalNotification

UILocalNotification 声音未播放

静音模式下的 UILocalNotification 声音

如何检测 UILocalnotification 声音是不是正在播放

发送通知时是不是可以停止播放 UILocalNotification 的声音?

如何为 UILocalNotification 添加声音?