UILocalNotification声音不会停止播放

时间:2014-07-02 09:37:00

标签: ios iphone audio uilocalnotification

我已将自定义.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但它没有任何帮助。 :(

1 个答案:

答案 0 :(得分:3)

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

- (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]; 
}

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

    自iOS 7以来,
  1. setVolume方法已被弃用(尽管很多应用程序仍在使用它)
  2. 您的应用在某个时刻将音量重新设置为正确(非零级别)
  3. 设置音量属性肯定会在其他可能同时播放声音或音乐的应用中产生副作用
  4. 更新2014年9月18日

    此问题似乎已在iOS 8上解决。