我写了一些应用程序,它发送延迟的本地通知,当收到通知我想根据设备移动决定做什么。 如果设备处于移动状态 - 使用新延迟设置相同的通知并保留在后台。 如果设备没有移动 - 弹出特定的视图控制器。
我确实成功了"没有驱动器"模式,但当设备处于移动状态时 - 我真的不知道如何处理这种情况。
这是我现在的代码,希望得到一些帮助 谢谢!
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
NSLog(@"Notification recieved from background...");
//check if device is in move
CLLocationManager *locationManager = [[CLLocationManager alloc]init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
locationManager.distanceFilter = 50;
[locationManager startMonitoringSignificantLocationChanges];
if (locationManager.location.speed > 10) {
NSLog(@"Device is in drive....");
notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:10];//TODO - Debug Set Real Time Before publish
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
NSLog(@"New Notification sent to device");
self.window.rootViewController = nil;
[self.window makeKeyAndVisible];
}
else{
NSLog(@"Device is not in drive....");
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
IGUViewFillDetailsController *vc = (IGUViewFillDetailsController *)[mainStoryboard instantiateViewControllerWithIdentifier:@"IGUViewFillDetailsController"];
vc.dic = notification.userInfo;
UINavigationController *navVC = [[UINavigationController alloc] initWithRootViewController: vc];
self.window.rootViewController = vc;
//[self.window addSubview:vc.view];
[self.window makeKeyAndVisible];
}
}
答案 0 :(得分:1)
问题1:
您安排了一个通知,它会在开火日期显示,您可以在开火日期前1秒取消通知并再次安排。假设您在10秒内触发此通知,您使用将在9秒内触发的NSTimer
,在您检查用户是否正在移动的计时器的选择器中,如果他正在移动,您取消通知并将其延迟10秒并再次安排,请记住您还必须更新计时器以在新通知的下一个开火日期之前进行检查。
Problem2:
这是默认行为,iOS将在应用程序进入后台之前拍摄快照,当应用程序退出后台时,它会显示此快照,您可以在applicationDidEnterBackground中添加空视图,然后此空视图将显示之前想要的观点。