2013-03-09 2 views
0

Когда приложение входит в фоновое состояние, время, используемое для работы в фоновом режиме, не работает. Ниже приведен код.Задача таймера iPhone для длинных процессов

В AppDelegate.h,

@interface AppDelegate : UIResponder <UIApplicationDelegate> 
{ 
    BOOL status; 
    UIBackgroundTaskIdentifier bgTask; 
} 

В AppDelegate.m

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 

    NSAssert(self->bgTask == UIBackgroundTaskInvalid, nil); 

    bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [application endBackgroundTask:self->bgTask]; 
      self->bgTask = UIBackgroundTaskInvalid; 
     }); 
    }]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     if ([application backgroundTimeRemaining] > 1.0) { 
      // Start background service synchronously 
      [[vController getInstance] run]; 

     } 

     [application endBackgroundTask:self->bgTask]; 
     self->bgTask = UIBackgroundTaskInvalid; 

    }); 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 
    NSAssert(self->bgTask == UIBackgroundTaskInvalid, nil); 

    bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [application endBackgroundTask:self->bgTask]; 
      self->bgTask = UIBackgroundTaskInvalid; 
     }); 
    }]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     if ([application backgroundTimeRemaining] > 1.0) { 

      // Start background service synchronously 
      [[vController getInstance] stopbackground]; 

     } 

     [application endBackgroundTask:self->bgTask]; 
     self->bgTask = UIBackgroundTaskInvalid; 

    }); 
} 

И вид controller.h,

@interface vController : UIViewController <AVAudioPlayerDelegate> 
-(void) run; 
-(void) stopbackground; 
-(void) getMessage:(NSTimer*)theTimer;; 
+(vController*) getInstance; 
@property (nonatomic,retain) NSTimer * timer; 
@end 

вид controller.m,

@implementation vController 
@synthesize timer; 
vController *tvc; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    tvc = self; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

+ (vController*) getInstance 
{ 
    return tvc; 
} 

- (void)stopbackground 
{ 
    timer = [NSTimer scheduledTimerWithTimeInterval:15.0 target:self selector:@selector(getMessage:) userInfo:nil repeats:YES]; 
} 

- (void)run 
{ 
    timer = [NSTimer scheduledTimerWithTimeInterval:15.0 target:self selector:@selector(getMessage:) userInfo:nil repeats:YES]; 
} 

- (void) getMessage:(NSTimer*) theTimer 
{ 

    NSError *error; 

    NSString *path = [[NSBundle mainBundle] pathForResource:@"alert" ofType:@"mp3"]; 
    AVAudioPlayer* theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&error]; 
    if (theAudio == nil) { 
     NSLog(@"%@", [error description]); 
    } 
    NSLog(@"Hi"); 
    theAudio.delegate = self; 
    theAudio.numberOfLoops = 1; 
    [theAudio play]; 
} 

- (void) dealloc{ 
    [timer release]; 
    [super dealloc]; 
} 

Я использую его на тренажере 6.0

ответ

0

В зависимости от вашего варианта использования это может быть невозможно. А именно, Apple не позволяет выполнить код в «фоновом режиме», если только вы выполняете одну из следующих задач:

  • Apps, которые играют звуковой контент пользователю в то время как в фоновом режиме, , такие как приложение музыкальный проигрыватель
  • приложения, которые поддерживают пользователей об их месте в любое время, например, в качестве навигационного приложения
  • Программы, которые поддерживают передачи голоса по IP-протоколу (VoIP)
  • Прессу приложений, которые необходимо загрузить и обработать новое содержание
  • Apps которые получают регулярные обновления тес от внешних аксессуаров

Узнайте больше на сайте: http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

+0

Большое спасибо за ваш ответ ... Мне нужно скачать что-то через http-связь и обработать данные, полученные с регулярным интервалом времени? – Shailesh

+0

Это подробная информация о реализации (загрузка через http). Какая из перечисленных выше точек указывает ваше приложение? Ну, это не может быть «регулярные обновления от внешних аксессуаров», не может быть «VoIP», не может быть «навигационным приложением», я бы поспорил, что это не «приложение для музыкального плеера». Это оставляет «приложения для газетных киосков» ... Если вы не делаете «приложение для газетных киосков» или мои предположения ошибочны, вы не должны пытаться запускать код в фоновом режиме, если вы хотите, чтобы ваше приложение было одобрено для AppStore. –

+0

Thanx для вашего ответа .... это основное требование приложения, которое он должен перейти на какой-то сервер и получить данные через http через регулярный промежуток времени. – Shailesh

0

По Созданию экземпляра вы можете запустить задачу фона в любом View-контроллере, как показано ниже:

// Объявляет следующее YourViewController.h файла.

+ (YourViewController *)getInstance; 
- (void)run; 
-(void)stopbackground; 

// Определите файл Vollowing в файле YourViewController.m.

static YourViewController *instance = NULL; 

+(YourViewController *)getInstance { 

    @synchronized(self) { 
     if (instance == NULL) { 
      instance = [[self alloc] init]; 
     } 
    } 
    return instance; 
} 


- (void)run 

{ 
// strat Back ground task 
} 
-(void)stopbackground 
{ 
// Stop Background task 
} 

в AppDelegate.h файле Объявить После

UIBackgroundTaskIdentifier bgTask; 

в AppDelegate.m файле используйте следующие методы.

- (void)applicationDidEnterBackground:(UIApplication *)application { 
    NSLog(@"Application entered background state."); 

    // bgTask is instance variable 
    NSAssert(self->bgTask == UIBackgroundTaskInvalid, nil); 

    bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [application endBackgroundTask:self->bgTask]; 
      self->bgTask = UIBackgroundTaskInvalid; 
     }); 
    }]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     if ([application backgroundTimeRemaining] > 1.0) { 
      // Start background service synchronously 
[[YourViewController getInstance] run]; 

     } 

     [application endBackgroundTask:self->bgTask]; 
     self->bgTask = UIBackgroundTaskInvalid; 

    }); 
} 


- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 

    NSLog(@"Application entered background state."); 

    // bgTask is instance variable 
    NSAssert(self->bgTask == UIBackgroundTaskInvalid, nil); 

    bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [application endBackgroundTask:self->bgTask]; 
      self->bgTask = UIBackgroundTaskInvalid; 
     }); 
    }]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     if ([application backgroundTimeRemaining] > 1.0) { 

// Start background service synchronously 
    [[YourViewController getInstance] stopbackground]; 

     } 

     [application endBackgroundTask:self->bgTask]; 
     self->bgTask = UIBackgroundTaskInvalid; 

    }); 


    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 
} 
+0

thax много для вашего ответа .. Siba Prasad, я попробую это. Thanx – Shailesh

+0

Нужно ли использовать таймер в методах Run и StopBackground для выполнения задачи, повторяющейся на регулярном промежутке времени? Помощь Pls ... – Shailesh

+0

Да Вы можете использовать Таймер с повторением ДА/НЕТ –

Смежные вопросы