title: Timer in background mode
body: <p>As we know there are some limitations for applications which running in background mode.For example, the NSTimer doesn't work. I tried to write a "Timer" like this which can work in background mode.</p>
  
  <pre><code>-(UIBackgroundTaskIdentifier)startTimerWithInterval:(NSTimeInterval)interval run:(void (^)())runBlock complete:(void (^)())completeBlock
  {
      NSTimeInterval delay_in_seconds = interval;
      dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, delay_in_seconds * NSEC_PER_SEC);
      dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  
      // ensure the app stays awake long enough to complete the task when switching apps
      UIBackgroundTaskIdentifier taskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
  
          completeBlock();
  
      }];
  
      NSLog(@"remain task time = %f,taskId = %d",[UIApplication sharedApplication].backgroundTimeRemaining,taskIdentifier);
  
      dispatch_after(delay, queue, ^{
          // perform your background tasks here. It's a block, so variables available in the calling method can be referenced here.
          runBlock();
  
          // now dispatch a new block on the main thread, to update our UI
          dispatch_async(dispatch_get_main_queue(), ^{
  
              completeBlock();
              [[UIApplication sharedApplication] endBackgroundTask:taskIdentifier];
          });
      });
  
      return taskIdentifier;
  
  }
  </code></pre>
  
  <p>I called this function like this:</p>
  
  <pre><code>-(void)fire
  {
      self.taskIdentifier = [self startTimerWithInterval:10
                                                     run:^{
                                                             NSLog(@"timer!");
                                                             [self fire];
                                                     }
                                                complete:^{
  
                                                    NSLog(@"Finished");
  
                                                }];
  
  }
  </code></pre>
  
  <p>This timer works perfect except that there is one problem. The longest period for background task is 10 minute.(Please refer to the NSLog in startTimerWithInterval).</p>
  
  <p>If there any way to make my timer work more than 10 minutes? By the way, my application is a BLE application, I set UIBackgroundModes to bluetooth-central already.</p>