iOS8 UILocalNotification 不起作用
Posted
技术标签:
【中文标题】iOS8 UILocalNotification 不起作用【英文标题】:iOS8 UILocalNotification not working 【发布时间】:2015-03-12 08:17:10 【问题描述】:我正在使用以下代码进行本地通知。但它不起作用。位置已成功更新并进入这些方法,但未触发通知。有什么想法吗?:
注意:当应用程序在后台时它可以工作,但在应用程序关闭时不工作。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)])
[application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
[[UIApplication sharedApplication] cancelAllLocalNotifications];
// Override point for customization after application launch.
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
return YES;
-(void) locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
if ([region isKindOfClass:[CLBeaconRegion class]])
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = @"You are checked in";
notification.soundName = @"Default";
[[UIApplication sharedApplication] presentLocalNotificationNow:notification];
【问题讨论】:
【参考方案1】:您应该记住,通知仅在您的应用处于后台而不是前台时出现。如果您在前台,请执行 AppDelegate 的- application:didReceiveLocalNotification:
并自行手动处理通知。
UPD
如果您的应用即使在后台也没有运行,您的代码将不会被执行。寻找Background modes(跟踪用户位置部分)以获取可能的解决方案,以要求系统通过事件启动您的应用程序,即使目前它不在内存中
【讨论】:
是的,你是对的。请阅读帖子。我需要在应用关闭或终止时收到通知。 @Idrees 我已经编辑了关于您的评论的答案 是的,我已经在后台模式下检查了位置更新,但仍然无法正常工作【参考方案2】:我的情况是通知已从
Settings -> Notifications -> YOUR_APP -> Allow Notifications
【讨论】:
【参考方案3】:即使您的应用程序已从后台删除,本地通知也会起作用。但是在您的情况下,您正在侦听位置管理器事件并在委托方法中触发本地通知。一旦您终止应用程序,您的位置管理器事件将不会被触发。所以你的本地通知根本不会被触发。
【讨论】:
【参考方案4】:文应用关闭 applicationDidEnterBackground 被调用所以把这个后台任务代码。并对本地通知进行分类。
- (void)applicationDidEnterBackground:(UIApplication *)application
bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^
// Clean up any unfinished task business by marking where you
// stopped or ending the task outright.
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
];
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
// Do the work associated with the task, preferably in chunks.
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
);
//// just u call the method want ever u want example
[self notification];
- (void)notification
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = @"You are checked in";
notification.soundName = @"Default";
[[UIApplication sharedApplication] presentLocalNotificationNow:notification];
我认为这对你有帮助。
【讨论】:
【参考方案5】:当您的应用被终止时,信标监控仍会重新启动它——这就是信标监控的伟大之处!
您需要做的就是在application:didFinishLaunchingWithOptions:
方法中重新启动监控。如果您这样做,导致应用程序启动的didEnterRegion
事件将立即传递给委托人,这应该会触发通知。
Estimote 有更详细的指南: Launching notifications in ios when the app is killed。它使用 Estimote SDK 中的 ESTBeaconManager、ESTBeaconManagerDelegate 和 ESTBeaconRegion 类,但您可以简单地将它们替换为常规的 Core Location 类以获得相同的效果。
【讨论】:
以上是关于iOS8 UILocalNotification 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
iOS8新特性之基于地理位置的消息通知UILocalNotification
如何使用 iOS 8 弃用设置每周重复的 UILocalNotification?
iOS 8 Beta 6 - 当应用程序处于后台时处理 UILocalNotification