从通知中心点击时,UILocalNotification 不会触发 didReceiveLocalNotification

UILocalNotification doesn't trigger didReceiveLocalNotification when tapping from Notification Center

我正在使用 Objective-c 在我的 iPhone 应用程序中创建一个 UILocalNotification。我的目标是 iOS 8 并使用 XCode 6.

我的问题涉及处理 UILocalNotification 当应用 不是 运行ning 并且它是通过点击通知打开的。当用户点击通知并打开应用程序时,我在 AppDelegate.m 中使用 didReceiveLocalNotification 来显示特定的视图控制器并向 VC 发送一些数据(日期)。

从锁定屏幕点击通知时,这可以正常工作。在通知中心点击通知时 didReceiveLocalNotification 永远不会被调用。我使用 UIAlertView 在我的设备上对此进行了测试。 didFinishLaunchingWithOptions 被调用,但是当我在该方法中包含显示特定视图控制器的代码时,它永远不会工作(尽管另一个 UIAlertView 告诉我它是 运行ning 那部分代码,只是从未完成 showViewController 方法)。

这是我的 didFinishLaunchingWithOptions 代码:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if ([UIApplication sharedApplication].scheduledLocalNotifications.count >= 1) {

        // Handle local notification received if app wasn't running in background
        UILocalNotification *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

        if ([[notification.userInfo objectForKey:@"notification"]  isEqual:@"mood rating"]) {
            // Create reportVC
                    NSLog(@"launched app and about to show reportvc");
            ReportViewController *reportVC = (ReportViewController *)[self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:@"reportVC"];

            // Date stuff goes here - code removed

            // show the reportVC
            [self.window.rootViewController showViewController:reportVC sender:self];
        }
    } else {
        [self createLocalNotification];
    }

    return YES;
}

这是我的 didReceiveLocalNotification 代码:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {

        // Create report view
        ReportViewController *reportVC = (ReportViewController *)[self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:@"reportVC"];

        // Same date stuff goes here as in didFinishLaunchingWithOptions

        // Show report vc
        [self.window.rootViewController showViewController:reportVC sender:self];
}

我取出的日期的东西只是检查它是否在晚上 9 点之后,然后创建今天或昨天的日期,然后将结果设置为报告的 属性VC.让我知道这是否相关,我会把它加回去。

所以这是我尝试解决的一些问题:

如果这搞砸了,下面是我目前正在测试的方法:

我将这两行添加到 didFinishLaunchingWithOptions 方法中:

[[UIApplication sharedApplication] cancelAllLocalNotifications];
[self createLocalNotification];

我将通知的预定时间更改为未来 3 分钟左右。它通常设置为每晚 9 点关闭,使用如下日期组件:

dateComponents.hour = 21;
dateComponents.minute = 0;

然后我将通知的 repeatInterval 更改为 NSCalendarUnitMinute 而不是 NSCalendarUnitDay 这是发布版本的设置。

然后我 运行 我的设备上的应用程序使用 XCode,一旦它是 运行 就停止它并安排通知。我又 运行 没有这两行:

[[UIApplication sharedApplication] cancelAllLocalNotifications];
[self createLocalNotification];

然后从 XCode 停止应用程序,在我的设备上打开多任务处理,向上滑动应用程序将其关闭,然后等待通知到达。点击每个测试通知后,我执行多项任务并再次关闭应用程序,这样我每次都可以从完全关闭的应用程序进行测试。

你可能想试试这个(用 dispatch_async() 异步显示你的视图控制器):

if ([[notification.userInfo objectForKey:@"notification"]  isEqual:@"mood rating"]) {

    dispatch_async(dispatch_get_main_queue(), ^{

        // Create reportVC
                NSLog(@"launched app and about to show reportvc");
        ReportViewController *reportVC = (ReportViewController *)[self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:@"reportVC"];

        // Date stuff goes here - code removed

        // show the reportVC
        [self.window.rootViewController showViewController:reportVC sender:self];
    });
}

或这个(在显示视图控制器之前调用 [self.window makeKeyAndVisible]):

if ([[notification.userInfo objectForKey:@"notification"]  isEqual:@"mood rating"]) {
    // Create reportVC
            NSLog(@"launched app and about to show reportvc");
    ReportViewController *reportVC = (ReportViewController *)[self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:@"reportVC"];

    // Date stuff goes here - code removed

    // show the reportVC
    [self.window makeKeyAndVisible];
    [self.window.rootViewController showViewController:reportVC sender:self];
}