UILocalNotification不会在ios9设备上触发(横幅未显示)

时间:2015-12-15 19:15:53

标签: ios notifications uilocalnotification simulator localnotification

此通知在模拟器(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];
}

远程通知适用于所有客户

4 个答案:

答案 0 :(得分:0)

如果您要发送本地通知,例如: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 doc的一部分:

  

宣言SWIFT

     

var alertBody:String?

     

讨论分配字符串   或者,最好是一个本地化字符串键(使用NSLocalizedString)   消息的价值。如果此属性的值为非零,则为   显示警报。默认值为nil(无警报)。 Printf风格   在显示之前从字符串中去除转义字符;至   在邮件中包含百分号(%),使用两个百分号   (%%)。

答案 1 :(得分:0)

从您当前的代码看,除非您的应用程序配置为在后台运行,否则可能无法调用选择器。 Roher的答案为您提供了适当的协议,但如果不起作用,请尝试从测试设备中手动删除应用程序,然后重新安装它。我遇到了一些用户在首次打开应用时出现要求获得通知权限的警报视图中意外点击否的问题。您可能无意中做到了这一点而没有注意到它。删除和重新安装将重新启动首次许可请求。如果您不想删除该应用程序,我认为您可以通过“设置”进行删除。

答案 2 :(得分:0)

问题是你在app进入后台后尝试打电话。这是不正确的,不起作用,有很多关于在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];
}

答案 3 :(得分:-1)

问题是我用过的     performSelector 但应该使用     performSelectorInBackground

如果应用程序在后台

performSelector不起作用