2013-11-20 47 views
4

我的应用程序需要定期调用一个方法。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秒调用方法,尽管应用程序在后台。

我读了这个问题:Timer in background mode

我必须能够提交申请AppStore的。

感谢

+1

您无法决定您的代码何时在后台运行。 iOS 7将允许您定期刷新您的内容,但这不会有保证的时间间隔 – wattson12

回答

7
- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ 
     // Clean up any unfinished task business by marking where you 
     // stopped or ending the task outright. 
     [application endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }]; 

    // Start the long-running task and return immediately. 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     // Do the work associated with the task, preferably in chunks. 

     [application endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }); 
} 

来源:iPhone Programmig Guide

相似问题:https://stackoverflow.com/a/8613624/1827690

1

在后台运行应用程序不断,你需要注册您的应用所需的背景模式在plist中

Documentation