Таймер iOS запускается в фоновом режиме
Мое приложение требует периодического вызова метода.
Этот вызов должен быть выполнен, даже если приложение было помещено в фоновом режиме.
Время, в которое приложение может находиться в фоновом режиме, не определено, в любое время приложение может перейти из фонового режима в возобновленное.
У меня есть класс для управления таймером:
@protocol TimerDelegate <NSObject>
- (void)startTimerAction:(id)userInfo;
@end
@interface TimerController : NSObject{
NSTimer *repeatingTimer;
id <TimerDelegate> delegate;
}
+ (TimerController *)sharedInstance;
- (void)startTimerForSender:(id <TimerDelegate>)sender withTimeInterval:(NSTimeInterval)time;
- (void)stopTimer;
@end
Реализация:
#import "TimerController.h"
TimerController *singletonInstance;
@implementation TimerController
#pragma mark - Singleton
+ (TimerController *)sharedInstance {
if (singletonInstance == nil) {
singletonInstance = [[super allocWithZone:NULL] init];
}
return singletonInstance;
}
+ (id)allocWithZone:(NSZone *)zone
{
return [self sharedInstance];
}
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
#pragma mark - Public
- (void)startTimerForSender:(id <TimerDelegate>)sender withTimeInterval:(NSTimeInterval)time
{
if (repeatingTimer) {
[self stopTimer];
}
if (sender) {
delegate = sender;
}
if (time > 0.0) {
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:time target:self selector:@selector(targetMethod:)
userInfo:[self userInfo] repeats:YES];
repeatingTimer = timer;
}
}
- (void)stopTimer
{
if (repeatingTimer) {
[repeatingTimer invalidate];
repeatingTimer = nil;
}
}
- (NSDictionary *)userInfo
{
return @{@"StartDate" : [NSDate date]};
}
- (void)targetMethod:(NSTimer*)theTimer
{
if (delegate && [delegate respondsToSelector:@selector(startTimerAction:)]) {
[delegate startTimerAction:[repeatingTimer userInfo]];
}
}
@end
Я используюTimerController
Класс таким образом:
-(void)viewDidLoad{
[super viewDidLoad]
TimerController *timerC = [TimerController sharedInstance];
[timerC startTimerForSender:self withTimeInterval:30];
}
#pragma mark - TimerDelegate
- (void)startTimerAction:(id)userInfo
{
NSLog(@"Method called");
}
Я могу читать вNSLog
записи каждые 30 секунд. Если приложение работает в фоновом режиме, таймер останавливается и он не записывает логи каждые 30 секунд, когда приложение возобновляет работу таймера.
Мне нужно вызывать метод каждые 30 секунд, хотя приложение находится в фоновом режиме.
Я прочитал этот вопрос:Таймер в фоновом режиме
Я должен иметь возможность подать заявку в AppStore.
Спасибо