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

Pha*_*013 11 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];
Run Code Online (Sandbox Code Playgroud)

此警报显示为预期的声音.但在某些情况下我无法停止声音.

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

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

2)当应用程序是背景屏幕锁定时,警报声音在应用程序到达前景时正常停止.

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

    application.applicationIconBadgeNumber = 0;
    [application cancelAllLocalNotifications];
Run Code Online (Sandbox Code Playgroud)

Gui*_*i13 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];
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


Chr*_*ian 1

在您的通知AppDelegate中,didFinishLaunchingWithOptions您会收到这样的通知:

UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if (localNotif) {
    // do something with it
}
Run Code Online (Sandbox Code Playgroud)

检查是否可以从那里停止警报cancelLocalNotification: