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

时间:2015-01-14 00:21:02

标签: ios objective-c iphone notifications uilocalnotification

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

我的问题与当应用未运行并且通过点击通知打开时处理UILocalNotification有关。当用户点按通知并打开应用时,我使用didReceiveLocalNotification中的AppDelegate.m来显示特定的视图控制器并向VC发送一些数据(日期)。

从锁定屏幕点击通知时,此功能正常。从未调用通知中心didReceiveLocalNotification中的通知时。我使用UIAlertView在我的设备上测试了这个。 didFinishLaunchingWithOptions被调用,但是当我包含代码以在该方法中显示特定的View Controller时,它永远不会工作(尽管另一个UIAlertView向我展示它正在运行代码的那一部分,但从未完成{ {1}}方法)。

这是我的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

我已经取出的日期内容只是检查它是否在晚上9点之后,创建今天的日期或昨天,然后将结果设置为reportVC的属性。如果这是相关的,请告诉我,我会将其重新添加。

所以这里有一些我试图解决的问题:

  • 我尝试使用- (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]; } 代替presentViewController:animated:completion:,但我想使用showViewController:sender:,因此我可以让导航栏显示出来,但这并没有解决问题反正。

  • 我已尝试将此行添加到我的showViewController方法中: [自我申请:申请didReceiveLocalNotification:通知]; 这确实解决了这个问题 - 从通知中心点击它打开了正确的视图,但它破坏了锁屏通知。添加此行后,当从锁定屏幕点击通知时,我得到了两次reportVC:第一个是除导航栏之外的黑屏,而顶部的那个是正确的。

  • 我尝试用以下代码替换当前的didFinishLaunchingWithOptions代码行: UIViewController * topController = [UIApplication sharedApplication] .keyWindow.rootViewController; [topController showViewController:reportVC sender:self]; 但这也没有解决问题。

  • 我尝试从我的showViewController方法中获取了我加倍的代码,因为我意识到didFinishLaunchingWithOptions似乎在didReceiveLocalNotification完成后仍在运行。情况似乎确实如此,但它并没有解决我的Notification Center通知问题。

如果这是搞砸了,我现在正在测试这个:

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

didFinishLaunchingWithOptions

我将通知的预定时间更改为将来约3分钟。它通常设置为每天晚上9点使用这样的日期组件:

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

我将通知的dateComponents.hour = 21; dateComponents.minute = 0; 更改为repeatInterval而不是NSCalendarUnitMinute,这是发布版本的设置。

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

NSCalendarUnitDay

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

1 个答案:

答案 0 :(得分:1)

您可能想要尝试此操作(与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];
}