我正在使用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停止应用程序,在我的设备上打开多任务处理,向上滑动应用程序以关闭它,然后等待通知到达。在点击每个测试通知后,我多次执行并再次关闭应用程序,以便每次都可以从完全关闭的应用程序进行测试。
答案 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];
}