当通过在警报上滑动将应用程序置于前台时,UILocalNotification不会停止声音

时间:2014-01-14 19:40:48

标签: ios ios7

当我的应用程序在后台收到网络消息时,它会创建一个带声音的UILocalNotification并调用presentLocalNotificationNow。

    UILocalNotification* localNotif = [[UILocalNotification alloc] init];
    localNotif.alertBody = [NSString stringWithFormat:@"%@: \r%@ \r%@", NSLocalizedString(@"XXXXXXXXXXX", nil), XXXXX, XXXXXXXXXXX];
    localNotif.alertAction = NSLocalizedString(@"View", nil);

    localNotif.soundName = [NSString stringWithFormat:@"%@.%@", XXXXTONE_LONGVERSION_FILENAME, XXXXTONE_FILENAME_EXT];
    [[UIApplication sharedInstance] presentLocalNotificationNow:localNotif];
    [localNotif release];

此警报会按预期显示声音。但在某些情况下,我无法停止声音。

1)当屏幕锁定并显示此本地通知警报时:

  • 如果用户通过在警报上滑动来解锁屏幕,则声音不会停止。
  • 如果用户通过滑动“>滑动解锁”来解锁屏幕,则会停止声音。

2)当应用程序处于后台并且没有屏幕锁定时,警报声会在应用程序到达前台时正常停止。

当应用程序在didReceiveLocalNotification和applicationDidBecomeActive中出现前景时,我会取消预定的本地通知。

    application.applicationIconBadgeNumber = 0;
    [application cancelAllLocalNotifications];

2 个答案:

答案 0 :(得分:5)

这是iOS7的一个已知错误,它很烦人 如果您使用远程通知,则会遇到完全相同的问题。

此解决方法是将应用程序徽章计数更改两次,至少步进值0。 我在我的应用程序中有这个方法:

- (void)fixRing{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        // iOS7 fix for notification sound not stopping.
        // see http://stackoverflow.com/questions/19124882/stopping-ios-7-remote-notification-sound
        [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 1];
        [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
    }
}

不要忘记有时候将徽章计数更新为实际值。

编辑: 实际上,这不适用于本地通知,但仅适用于远程(推送)通知。 [application cancelAllLocalNotifications];不起作用,[application cancelLocalNotification:notif];也不起作用 这是我向Apple报告的一个错误,在撰写本文时处于“过程”状态 我已经尝试了很多解决方法(按一个小声音的通知擦除长音,使用计时器并用较短的声音重复通知,而不是让它逗留30秒等等。 )但都没有奏效。

请注意,Google Hangout似乎也遇到了这个问题..所以我猜没有真正的解决方案。

答案 1 :(得分:1)

AppDelegate didFinishLaunchingWithOptions UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; if (localNotif) { // do something with it } 中,您会收到类似的通知:

cancelLocalNotification:

检查,是否可以使用{{1}}

停止来自该处的警报