iOS Timer läuft im Hintergrund

Meine Anwendung erfordert den regelmäßigen Aufruf einer Methode.

Dieser Aufruf sollte auch dann erfolgen, wenn die Anwendung in den Hintergrund gestellt wurde.

Die Zeit, zu der sich die Anwendung im Hintergrund befinden kann, ist undefiniert und kann jederzeit vom Hintergrund aus fortgesetzt werden.

Ich habe eine Klasse zum Verwalten des Timers:

@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

Implementierung:

#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

Ich verwende dasTimerController klasse auf diese weise:

-(void)viewDidLoad{
[super viewDidLoad]
TimerController *timerC = [TimerController sharedInstance];
[timerC startTimerForSender:self withTimeInterval:30];

}

#pragma mark - TimerDelegate

- (void)startTimerAction:(id)userInfo
{
NSLog(@"Method called");
}

Ich kann einlesenNSLog Einträge alle 30 Sekunden. Wenn Sie die Anwendung in den Hintergrund stellen, stoppt der Timer und es werden nicht alle 30 Sekunden Protokolle geschrieben. Wenn die Anwendung den Timer fortsetzt, funktioniert der Timer ordnungsgemäß.

Ich muss Methode alle 30 Sekunden aufrufen, obwohl sich die Anwendung im Hintergrund befindet.

Ich habe diese Frage gelesen:Timer im Hintergrundmodus

Ich muss in der Lage sein, eine Bewerbung bei AppStore einzureichen.

Vielen Dank

Antworten auf die Frage(2)

Ihre Antwort auf die Frage