在didFinishLaunchingWithOptions
定时器循环中,每隔1分钟调用一次函数httpRequest
。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//rest of code
NSTimer *notifyTimer = [NSTimer timerWithTimeInterval:60 target:self selector:@selector(httpRequest) userInfo:nil repeats:YES];//7200.0
[[NSRunLoop mainRunLoop] addTimer:notifyTimer forMode:NSDefaultRunLoopMode];
return YES;
}
按下主页按钮后,应用程序将进入后台并调用函数applicationDidEnterBackground
,因此后台任务正在启动。
- (void)applicationDidEnterBackground:(UIApplication *)application
{
__block UIBackgroundTaskIdentifier bgTask;
UIApplication *app = [UIApplication sharedApplication];
expirationHandler = ^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
bgTask = [app beginBackgroundTaskWithExpirationHandler:expirationHandler];
};
bgTask = UIBackgroundTaskInvalid;
bgTask = [app beginBackgroundTaskWithExpirationHandler:expirationHandler];
}
通过httpRequest
函数,我每隔1分钟就会从网络服务器发出Y
,所以UILocalNotification
会在每秒后触发。
-(NSString *)httpRequest {
NSURL *url = [NSURL URLWithString:@"http://192.168.10.67/t.php"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
NSString *userAgent = [NSString stringWithFormat:@"bgTaskTest-IOS"];
[request setValue:userAgent forHTTPHeaderField:@"User-Agent"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];
[request setHTTPMethod:@"GET"];
[request setTimeoutInterval:25];
NSURLResponse *response;
NSData *dataReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
NSString *stringReply = [[NSString alloc] initWithData:dataReply encoding:NSASCIIStringEncoding];
if ([stringReply isEqualToString:@"Y"]) {
[self showLocalNotification:nil]; //calling UILocalNotification
} else {
NSLog(@"%@",stringReply);
}
return stringReply;
}
根据showLocalNotification
函数的响应,函数httpRequest
每1分钟调用一次。
-(void)showLocalNotification {
NSString *msg = @"test message";
[[UIApplication sharedApplication] cancelAllLocalNotifications];
UILocalNotification *_localNotification = [[UILocalNotification alloc]init];
_localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:1];
_localNotification.timeZone = [NSTimeZone defaultTimeZone];
_localNotification.alertBody = msg;
_localNotification.soundName = UILocalNotificationDefaultSoundName;
_localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber]+1;
[[UIApplication sharedApplication] scheduleLocalNotification:_localNotification];
//[[UIApplication sharedApplication] presentLocalNotificationNow:_localNotification];
}
一切都是正确的,当应用程序处于后台时,通知会在每1个munite之后提示。
但我的问题是后台任务的续航时间是10分钟,所以10分钟后没有通知提示。出于这个原因,我在beginBackgroundTaskWithExpirationHandler
中再次启动后台任务,但我的应用程序在重启后台任务的时候终止。
当应用程序处于后台时,我无法使用超过10分钟的通知。
请有人帮助我。
答案 0 :(得分:1)
在应用商店指南中没有办法在后台运行任意代码超过十分钟(正如您所注意到的)。
10分钟后,您的应用将被暂停。有几种方法,注册其他背景模式(如背景音频,连续播放静音文件)或背景音乐或后台位置服务。
这些糟糕的工作将使您的应用程序取消暂停,但您的应用程序将无法获得商店的批准。
在iOS7中,在后台运行代码方面取得了进展,但没有什么可以达到你想要的效果。
因此,如果这是一个供您自己使用的应用,请使用私有API或我上面建议的方法,但是如果您想在商店购买此应用,我担心您的运气不好。