setKeepAliveTimeout und BackgroundTasks

Habe ich eine große Kopfschmerzen mit dem Thema. Ich arbeite an einer Anwendung, muss die Umfrage auf einem webserver regelmäßig, um zu prüfen, ob neue Daten. Auf der Grundlage der zurückgegebenen Informationen, ich möchte die push-lokale Benachrichtigung an den Benutzer.

Ich weiß, dieser Ansatz ist etwas anders als dargestellt von Apple, in dem ein remote-server macht die Arbeit, schob ein remote-Benachrichtigung, basierend auf APNS. Es gibt jedoch viele Gründe die kann ich nicht nehmen, diesen Ansatz in Betracht. Einer für alle, ist die Benutzer-Authentifizierung Mechanismus. Der remote-server aus Gründen der Sicherheit nicht berücksichtigt werden die Anmeldeinformationen des Benutzers. Alles, was ich tun kann, ist, bewegen Sie den login und das abrufen Kern, dem client (iPhone).

Bemerkte ich, dass Apple bietet eine Möglichkeit für Anwendungen, wake-up und halten, eröffnet eine Socket-Verbindung (dh. eine VoIP-Anwendung).

Also fing ich an zu untersuchen, in dieser Art und Weise. Hinzugefügt die erforderlichen Informationen in der plist, ich bin in der Lage, "wake" meine Bewerbung, mit so etwas in meiner appDelegate:

[[UIApplication sharedApplication] setKeepAliveTimeout:1200 handler:^{ 
    NSLog(@"startingKeepAliveTimeout");
    [self contentViewLog:@"startingKeepAliveTimeout"];
    MyPushOperation *op = [[MyPushOperation alloc] initWithNotificationFlag:0 andDataSource:nil];
    [queue addOperation:op];
    [op release];
}];

Die NSOperation, dann startet eine hintergrund-task mit dem folgenden code-block:

#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:&outResponse error:&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];
        });
    }
}

Der obige code scheint zu funktionieren (manchmal), aber viele andere stürzt meine Anwendung mit den folgenden log-Informationen:

Exception Type:  00000020
Exception Codes: 0x8badf00d
Highlighted Thread:  3

Application Specific Information:
DemoBackApp[5977] has active assertions beyond permitted time: 
{(
    <SBProcessAssertion: 0xa9da0b0> 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

Für diejenigen, die Fragen, ja. Ich habe versucht, die Async NSURLConnection Ansatz, zu. Egal. Es crash das gleiche, auch wenn ich einen asynchronen Ansatz mit timeout-handler und didFinishLoading:WithError.

Ich bin stecken. Alle Hinweise sind hoch geschätzt.

InformationsquelleAutor valvoline | 2011-01-24

Schreibe einen Kommentar