Note that there are some explanatory texts on larger screens.

plurals
  1. POsetKeepAliveTimeout and BackgroundTasks
    primarykey
    data
    text
    <p>I've a big headache with the topic. I'm working on an application that needs to poll a webserver regularly, in order to check for new data. Based on the returned information, I wish to push a local notification to the user.</p> <p>I know that this approach is slightly different from the one depicted by Apple, in which a remote server makes the work, pushing a remote notification, based on APNS. However, there are many reasons for which i cannot take this approach in consideration. One for all, is the user authentication mechanism. The remote server, for security reasons, cannot take into account the user credentials. All that i can do is to move the login and fetching core, to the client (iPhone).</p> <p>I noticed that Apple offers an opportunity for applications to wake-up and keep opened a Socket connection (ie. a VoIP application). </p> <p>So, I started investigate in this way. Added the required information in the plist, I'm able to "wake" my application, using something like this in my appDelegate:</p> <pre><code>[[UIApplication sharedApplication] setKeepAliveTimeout:1200 handler:^{ NSLog(@"startingKeepAliveTimeout"); [self contentViewLog:@"startingKeepAliveTimeout"]; MyPushOperation *op = [[MyPushOperation alloc] initWithNotificationFlag:0 andDataSource:nil]; [queue addOperation:op]; [op release]; }]; </code></pre> <p>The NSOperation, then starts a background task using the following block code:</p> <pre><code>#pragma mark SyncRequests -(void) main { NSLog(@"startSyncRequest"); [self contentViewLog:@"startSyncRequest"]; bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ NSLog(@"exipiration handler triggered"); [app endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; [self cancel]; }]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSMutableURLRequest *anURLRequest; NSURLResponse *outResponse; NSError *exitError; NSString *username; NSString *password; NSLog(@"FirstLogin"); anURLRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:webserverLogin, username, password]]]; [anURLRequest setHTTPMethod:@"GET"]; [anURLRequest setTimeoutInterval:120.00]; [anURLRequest setCachePolicy:NSURLRequestReloadIgnoringCacheData]; exitError = nil; NSData *tmpData = [NSURLConnection sendSynchronousRequest:anURLRequest returningResponse:&amp;outResponse error:&amp;exitError]; [anURLRequest setTimeoutInterval:120.00]; if(exitError != nil) { //somethings goes wrong NSLog(@"somethings goes wrong"); [app endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; [self cancel]; return; } //do some stuff with NSData and prompt the user with a UILocalNotification NSLog(@"AlltasksCompleted"); [app endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; [self cancel]; }); } } </code></pre> <p>The above code seems to work (sometimes), but many other it crashes my application, with the following log information:</p> <pre><code>Exception Type: 00000020 Exception Codes: 0x8badf00d Highlighted Thread: 3 Application Specific Information: DemoBackApp[5977] has active assertions beyond permitted time: {( &lt;SBProcessAssertion: 0xa9da0b0&gt; identifier: UIKitBackgroundCompletionTask process: DemoBackApp[5977] permittedBackgroundDuration: 600.000000 reason: finishTask owner pid:5977 preventSuspend preventIdleSleep )} Elapsed total CPU time (seconds): 0.010 (user 0.010, system 0.000), 100% CPU Elapsed application CPU time (seconds): 0.000, 0% CPU </code></pre> <p>For ones who ask, yes. I've tried the Async NSURLConnection approach, too. No matter. It crash the same, even if I use an async approach with timeout handler and didFinishLoading:WithError.</p> <p>I'm stuck. Any hints are high appreciated.</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload