当我的应用程序在后台收到网络消息时,它会创建一个带声音的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];
答案 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}}
停止来自该处的警报