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

当应用程序使用 ios 8 在前台时,调度程序 UILocalNotification 不起作用

从 iOS8 中的通知在后台启动呼叫

快速创建基于本地位置的通知