iOS background Location not sending http request

后端 未结 3 460
春和景丽
春和景丽 2021-01-31 06:27

My app needs to track the users location in the background but it is failing to send a \'get\' request. The http request gets sent immediately when the app comes to the foregrou

相关标签:
3条回答
  • 2021-01-31 06:43

    I'm using exactly the same code as you and it works for me in RestKit. The only way I could make it work is ny creating a synchronous request (it doesn't make a lot of sense to do it asynchronously in this context anyway!). Please check this code and let us know if it works:

    // REMEMBER. We are running in the background if this is being executed.
    // We can't assume normal network access.
    // bgTask is defined as an instance variable of type UIBackgroundTaskIdentifier
    
    // Note that the expiration handler block simply ends the task. It is important that we always
    // end tasks that we have started.
    
    _bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:
               ^{
                   [[UIApplication sharedApplication] endBackgroundTask:_bgTask];
               }];
    
    // ANY CODE WE PUT HERE IS OUR BACKGROUND TASK
    
    // For example, I can do a series of SYNCHRONOUS network methods (we're in the background, there is
    // no UI to block so synchronous is the correct approach here).
    
    NSNumber *latNumber = [NSNumber numberWithDouble:location.coordinate.latitude];
    NSNumber *lngNumber = [NSNumber numberWithDouble:location.coordinate.longitude];
    NSNumber *accuracyNumber = [NSNumber numberWithDouble:location.horizontalAccuracy];
    NSDictionary *params = [NSDictionary dictionaryWithKeysAndObjects:@"lat",latNumber,@"lng",lngNumber,@"accuracy",accuracyNumber, nil];
    RKURL *URL = [RKURL URLWithBaseURL:[NSURL URLWithString:SERVER_URL] resourcePath:@"/user/location/update" queryParameters:params];
    RKRequest *request = [RKRequest requestWithURL:URL];
    request.method = RKRequestMethodGET;
    NSLog(@"Sending location to the server");
    RKResponse *response = [request sendSynchronously];
    if (response.isFailure)
        NSLog(@"Unable to send background location, failure: %@", response.failureErrorDescription);
    else {
        NSError *error = nil;
        NSDictionary *parsedBody = [response parsedBody:&error];
        if (YES == [[parsedBody objectForKey:@"result"] boolValue]){
            NSLog(@"Background location sent to server");
        }
        else {
            //Something went bad
            NSLog(@"Failed to send background location");
        }
    }
    // AFTER ALL THE UPDATES, close the task
    
    if (_bgTask != UIBackgroundTaskInvalid)
    {
        [[UIApplication sharedApplication] endBackgroundTask:_bgTask];
        _bgTask = UIBackgroundTaskInvalid;
    }
    

    I'm almost sure the new thread spawned for your RKClient request is automatically killed after invoking it.

    0 讨论(0)
  • 2021-01-31 06:44

    When you're application is running in the background you can finish a HTTP request you started before you entered the background but you cannot initiate a new request. You can only initiate certain network operations while in the background (voip, newsstand).

    0 讨论(0)
  • 2021-01-31 06:52

    Re-creating original suggestion as an answer

    Have your try replacing your restKit calls with a stock synchronous NSURLConnection? – dklt Sep 20

    0 讨论(0)
提交回复
热议问题