UILocalNotification 不会在 ios9 设备上触发(横幅未显示)
Posted
技术标签:
【中文标题】UILocalNotification 不会在 ios9 设备上触发(横幅未显示)【英文标题】:UILocalNotification doesn't fire on ios9 device (banner not showing) 【发布时间】:2015-12-15 19:15:52 【问题描述】:此通知在模拟器 (9.2) 上完美触发,在 iPhone 6(9.2) 上不会触发:
UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.soundName = UILocalNotificationDefaultSoundName;
localNotification.alertBody = NSLocalizedString(@"You are going to be disconnected. To continue being online, please open the application",nil);
[[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];
我从以下位置调用此代码:
- (void)applicationDidEnterBackground:(UIApplication *)application
[self performSelector:@selector(sendLocalNotification) withObject:nil afterDelay:5];
远程通知适用于所有客户
【问题讨论】:
【参考方案1】:从您当前的代码看来,除非您的应用配置为在后台运行,否则可能不会调用选择器。 Roher 的回答为您提供了正确的协议,但如果这不起作用,请尝试从您的测试设备中手动删除该应用程序,然后重新安装它。我遇到了一些用户在第一次打开应用程序时不小心在出现的请求允许发送通知的警报视图中点击“否”的问题。您可能在没有注意到的情况下无意中做到了这一点。删除并重新安装将重新发起首次权限请求。如果您不想删除该应用,我认为您可以从“设置”中删除。
【讨论】:
手动重新安装没有帮助。用 ios9.2 尝试了两台设备 - 本地通知横幅没有出现(虽然我可以在上层“今天”看到通知)【参考方案2】:问题是您在应用程序进入后台后尝试调用某些内容。这是不正确的,不会起作用的,有很多关于在iOS上运行后台任务的文章。
您可以这样安排通知:
- (void)applicationDidEnterBackground:(UIApplication *)application
UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.soundName = UILocalNotificationDefaultSoundName;
localNotification.alertBody = NSLocalizedString(@"You are going to be disconnected.", nil);
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:5.0];
[application scheduleLocalNotification:localNotification];
如果用户在 5 秒间隔到期之前打开您的应用,您可以取消此通知:
- (void)applicationDidBecomeActive:(UIApplication *)application
[application cancelLocalNotification:application];
// If you don't want to keep reference to the notification
// [application cancelAllLocalNotifications];
【讨论】:
我正在按照您的描述进行操作。在 applicationDidEnterBackground 中调度和在 applicationDidBecomeActive 中取消。在模拟器中工作正常,在设备中没有(通知出现在上窗帘但没有显示为跳板上的横幅) @protspace,尝试重启你的设备。 重启了几次 - 没有帮助。我还注意到我在打开应用程序后看到了横幅(再次将其发送到前台)。看起来他们只是在等我打开应用程序。但是当应用程序处于后台时它们不会显示( 嗯,那你可以试试向苹果举报。【参考方案3】:如果您想触发本地通知,例如:5 秒后使用此代码:
- (void)applicationDidEnterBackground:(UIApplication *)application
UILocalNotification* localNotification = [UILocalNotification new];
localNotification.fireDate = [[NSDate new] dateByAddingTimeInterval:5]; // Notification will be fired after 5 since now.
localNotification.alertBody = @"Your alert message";
localNotification.timeZone = [NSTimeZone defaultTimeZone];
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
注意:如果您想接收通知,您必须征得用户的许可,例如:
UIUserNotificationType types = UIUserNotificationTypeBadge |
UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *mySettings =
[UIUserNotificationSettings settingsForTypes:types categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
上面列出的权限代码可以在您的AppDelegate.m
中调用,例如:在didFinishLaunchingWithOptions
方法中。您必须知道performSelector
方法不适用于这种情况,每个UILocalNotification
都有fireDate
属性,应该使用给定的NSDate
延迟来触发通知。
更新
今天我遇到了同样的问题,我以alertBody
空字符串传递并且没有出现通知。所以在我看来你的
NSLocalizedString(@"You are going to be disconnected. To continue being online, please open the application",nil);
返回空字符串或 nil。
请尝试将任何其他字符串分配给alertBody
属性,例如
localNotification.alertBody = @"test"
它应该可以工作:)
Apple 文档的一部分:
SWIFT 声明
var alertBody: String?
讨论 分配一个字符串 或者,最好是本地化字符串键(使用 NSLocalizedString)作为 消息的价值。如果此属性的值为非零,则 显示警报。默认值为 nil(无警报)。 Printf 风格 在显示之前从字符串中去除转义字符;到 在消息中包含百分号 (%),使用两个百分号 (%%)。
【讨论】:
您的代码也不起作用。并且完全按照您的描述要求获得许可。另外我想说的是,删除推送对所有客户都有效。只有本地通知不会出现在设备上(但会出现在模拟器上)。 您确定已在设置中为您的应用开启通知功能? 通知已开启。我还注意到通知实际上出现在通知部分的上层窗帘中。但是在跳板上时它们不会显示在屏幕上 谢谢。但我发现了问题:问题是我使用了 performSelector 但应该使用 performSelectorInBackground performSelector 如果应用程序在后台不起作用 但是为了这个目的你应该使用fireDate,但是OK :)【参考方案4】:问题是我用过 执行选择器 但应该使用 performSelectorInBackground
如果应用程序在后台运行,则执行选择器不起作用
【讨论】:
以上是关于UILocalNotification 不会在 ios9 设备上触发(横幅未显示)的主要内容,如果未能解决你的问题,请参考以下文章
UILocalNotification 在后台 10 分钟后不会触发