我的应用程序正在使用谷歌地图,它显示了汽车的方向,因此用户可以看到它在地图上移动,我的问题是: 1.当用户将应用程序置于后台时,我希望NSTimer继续运行 2.虽然它在后台,当我收到来自api的响应,汽车到达时,我想发送本地通知,以便用户可以看到它并打开应用程序
这里有一些代码:
//here is the timer
searchTimer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(getLocationForDriver) userInfo:Nil repeats:YES];
-(void)getLocationForDriver
{
NSArray* pks = [NSArray arrayWithObject:self.driverPK];
[[NetworkEngine getInstance] trackBooking:pks completionBlock:^(NSObject* response)
{
NSDictionary* dict = (NSDictionary*)response;
currentStatus = [dict objectForKey:@"current_status"];
.
.
.
.
if ([currentStatus isEqualToString:@"completed"])
{
//here i want to send the local notification
}
}
}
答案 0 :(得分:1)
通常当应用程序发送到后台时,系统会很快终止它。例外情况是适用于Apple UIBackgroundModes
之一的应用程序(我建议您阅读更多关于app states and multitasking的内容,特别是有关长时间运行后台任务的部分)。这种机制允许需要在后台运行长任务的应用程序不会被终止(导航应用程序,VoIP应用程序,音乐应用程序......)
根据您的问题,您的应用使用位置更新后台模式似乎是合理的。要启用此模式,您需要转到目标 - >功能,将背景模式设置为打开并检查位置更新框。
完成后,一旦将应用程序发送到后台,您的应用程序将无法终止,您应该能够运行NSTimer
,获取api响应并发送通常的通知。
请注意,您的应用需要使用其中一种后台模式的充分理由,否则将会从应用商店中拒绝。
<强>更新强>
要发送本地通知,您可以在代码中添加以下行:
if ([currentStatus isEqualToString:@"completed"])
{
UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = [NSDate date];
localNotification.alertBody = @"My notification text";
localNotification.timeZone = [NSTimeZone defaultTimeZone];
localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}
这会立即发送本地通知,并为应用的图标徽章添加+1。 (您可以详细了解UILocalNotification
here和here)
如果您的应用在触发通知时在后台运行,则用户会在屏幕顶部看到通知为横幅。
然后,您可以通过实现应用程序委托的application:didReceiveLocalNotification:
方法来处理通知。请注意,如果您的应用程序在后台运行,则只有在用户通过单击通知横幅或应用程序图标将应用程序带到前台时,才会调用此方法。