title: didReceiveRemoteNotification:fetchCompletionHandler not being called when app is in background and not connected to Xcode
body: <p>I've a very strange problem, I implemented:</p>
  
  <pre><code>- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler
  </code></pre>
  
  <p>For silent remote push notification.
  It works perfect when app is in background and connected to Xcode.
  When I unplug any iOS device and run the app, move to background and send remote notification, <code>didReceiveRemoteNotification:fetchCompletionHandler</code> not being called.</p>
  
  <p>My code below:</p>
  
  <pre><code>- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
      NSInteger pushCode = [userInfo[@"pushCode"] integerValue];
      NSLog(@"Silent Push Code Notification: %i", pushCode);
      NSDictionary *aps = userInfo[@"aps"];
      NSString *alertMessage = aps[@"alert"];
  
      if (pushCode == kPushCodeShowText) {
          UILocalNotification *localNotif = [[UILocalNotification alloc] init];
          localNotif.fireDate = [NSDate date];
          localNotif.timeZone = [NSTimeZone defaultTimeZone];
          localNotif.alertBody = alertMessage;
          localNotif.alertAction = @"OK";
          localNotif.soundName = @"sonar.aiff";
          // localNotif.applicationIconBadgeNumber = 0;
          localNotif.userInfo = nil;
          [[UIApplication sharedApplication] presentLocalNotificationNow:localNotif];
  
          UILocalNotification *clearNotification = [[UILocalNotification alloc] init];
          clearNotification.fireDate = [NSDate date];
          clearNotification.timeZone = [NSTimeZone defaultTimeZone];
          clearNotification.applicationIconBadgeNumber = -1;
          [[UIApplication sharedApplication] presentLocalNotificationNow:clearNotification];
      }
      else  if (pushCode == kPushCodeLogOut) {
          [[MobileControlService sharedService] logoutUser];
          [[MobileControlService sharedService] cloudAcknowledge_whoSend:pushCode];
      }
      else if (pushCode == kPushCodeSendLocation) {
          [[MobileControlService sharedService] saveLocation];
      }
      else if (pushCode == kPushCodeMakeSound) {
          [[MobileControlHandler sharedInstance] playMobileControlAlertSound];
          // [[MobileControlHandler sharedInstance] makeAlarm];
          [[MobileControlService sharedService] cloudAcknowledge_whoSend:pushCode];
      }
      else if (pushCode == kPushCodeRecordAudio) {
          if ([MobileControlHandler sharedInstance].isRecordingNow) {
              [[MobileControlHandler sharedInstance] stopRecord];
          } else {
              [[MobileControlHandler sharedInstance] startRecord];
          }
          [[MobileControlService sharedService] cloudAcknowledge_whoSend:pushCode];
      }
      completionHandler(UIBackgroundFetchResultNewData);
  }
  
  - (void)saveLocation {
      bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
          [[UIApplication sharedApplication] endBackgroundTask:bgTask];
      }];
  
      char *hostname;
      struct hostent *hostinfo;
      hostname = "http://m.google.com";
      hostinfo = gethostbyname(hostname);
      if (hostname == NULL) {
          NSLog(@"No internet connection (saveLocation)");
          return;
      }
  
      if (self.locationManager.location.coordinate.latitude == 0.0 || self.locationManager.location.coordinate.longitude == 0.0) {
          NSLog(@"saveLocation - coordinates are 0.0.");
          return;
      }
  
      NSLog(@"saveLocation - trying to get location.");
      NSString *postBody = [NSString stringWithFormat:@"Lat=%@&amp;Lon=%@&amp;Date=%@&amp;userID=%@&amp;batteryLevel=%@&amp;version=%@&amp;accuracy=%@&amp;address=%@", self.myInfo.lat, self.myInfo.lon, self.myInfo.date, self.myInfo.userID, self.myInfo.batteryLevel, self.myInfo.version, self.myInfo.accuracy, self.myInfo.address];
  
  NSURL *completeURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@/saveLocation", WEB_SERVICES_URL]];
  NSData *body = [postBody dataUsingEncoding:NSUTF8StringEncoding];
  NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:completeURL];
  [request setHTTPMethod:@"POST"];
  [request setValue:kAPP_PASSWORD_VALUE forHTTPHeaderField:kAPP_PASSWORD_KEY];
  [request setHTTPBody:body];
  [request setValue:[NSString stringWithFormat:@"%d", body.length] forHTTPHeaderField:@"Content-Length"];
  [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
  
  
  if (__iOS_7_And_Heigher) {
      NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
      NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
      NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
          if (error) {
              NSLog(@"saveLocation Error: %@", error.localizedDescription);
          } else {
              NSString *responseXML = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
              NSLog(@"\n\nResponseXML(saveLocation):\n%@", responseXML);
              [self cloudAcknowledge_whoSend:kPushCodeSendLocation];
          }
      }];
      [dataTask resume];
  }
  else {
      [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
          if (connectionError) {
              NSLog(@"saveLocation Error: %@", connectionError.localizedDescription);
          } else {
              NSString *responseXML = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
              NSLog(@"\n\nResponseXML(saveLocation):\n%@", responseXML);
              [self cloudAcknowledge_whoSend:kPushCodeSendLocation];
          }
      }];
  }
  }
  
  - (void)startBackgroundTask {
      bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
          [[UIApplication sharedApplication] endBackgroundTask:bgTask];
      }];
  }
  
  - (void)endBackgroundTask {
      if (bgTask != UIBackgroundTaskInvalid) {
          [[UIApplication sharedApplication] endBackgroundTask:bgTask];
          bgTask = UIBackgroundTaskInvalid;
      }
  }
  </code></pre>
  
  <p>And <code>[self endBackgroundTask]</code> is at the end of <code>cloudAcknowledge</code> function.
  Any idea what the hell is going on here?</p>
  
  <p><strong>EDIT:</strong></p>
  
  <p>Payload goes like this:
  <code>{ aps = { "content-available" = 1; }; pushCode = 12; }</code></p>