当我的应用程序在后台收到网络消息时,它会创建一个带声音的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)
这是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似乎也遇到了这个问题..所以我猜没有真正的解决方案.
在您的通知AppDelegate中,didFinishLaunchingWithOptions您会收到这样的通知:
UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if (localNotif) {
// do something with it
}
Run Code Online (Sandbox Code Playgroud)
检查是否可以从那里停止警报cancelLocalNotification:
| 归档时间: |
|
| 查看次数: |
2500 次 |
| 最近记录: |