Search code examples
iosobjective-cnsurlconnectionuilocalnotificationbackground-fetch

Background Fetch and Local Notification


In my app, I am planning to use Local Notification and not Push Notifications. I need to check whether a transaction update is available, if YES, just notify the user with Local Notification. I have done the below steps.

  1. In didFinishLaunchingWithOptions, set fetch interval [[UIApplication sharedApplication]setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum].
  2. -(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

> Added code for POST Request as below with my request data:

NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self];

if(conn) {
    completionHandler(UIBackgroundFetchResultNewData);
}
 else {
    completionHandler(UIBackgroundFetchResultFailed);
}
  1. After response parsing, comparing if any update is there and if any update is there, notification is displayed using the below code.

    UILocalNotification* localNotification = [[UILocalNotification alloc] init]; localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:1];
    localNotification.timeZone = [NSTimeZone defaultTimeZone];
    localNotification.alertTitle = @"SIB Mirror";
    localNotification.alertBody = @"You have a new transaction. Go to e-Statements to view it.";
    localNotification.timeZone = [NSTimeZone defaultTimeZone];
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
    

The issue is most of the times, when phone is locked, getting error message >Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost."

and hence notification was not getting displayed. But when I connect Phone directly to Phone and in debug mode enable background sync, every thing works properly.

Kindly guide me an easy approach to do this or correct me if anything I am doing wrongly.

Thanks,

Mobile Developer.


Solution

  • Try the below code:

    NSURLResponse * response = nil;
                NSError * error = nil;
                NSData * data = [NSURLConnection sendSynchronousRequest:request
                                                      returningResponse:&response
                                                                  error:&error];
    
    if (error == nil)
    {
     // Parse data here
      completionHandler(UIBackgroundFetchResultNewData);
    }
    else {
      completionHandler(UIBackgroundFetchResultFailed);
    
    }