CLLocationManager: нет сети, сохраняются координаты и повторная отправка, когда сеть становится доступной? - PullRequest
0 голосов
/ 26 октября 2011

У меня довольно простая реализация CLLocationManager.Он собирает пользовательские координаты и, когда данные имеют подходящее расстояние и точность, отправляет на мой сервер.Однако иногда нет подключения к сети.В этих случаях мне нужно хранить данные локально и повторно отправлять на мой сервер, когда соединение возвращается.Как мне,

A: сохранять и извлекать данные локально?

B: инструктировать CLLocationManager повторно отправлять при восстановлении подключения?

Wrinkle: я непрерывно собираю данные наперемещение цели, поэтому мне может потребоваться сохранить несколько или несколько координат в массиве, пока не восстановится сетевое соединение.Еще одна проблема: я новичок в разработке для iOS :)

То, что я считаю, является важной частью моего кода:

    NetworkStatus internetStatus = [[Reachability reachabilityForInternetConnection] currentReachabilityStatus];

    if( internetStatus != NotReachable ) {
        NSData* data = [NSURLConnection sendSynchronousRequest:post returningResponse:response error:error];

        if( data == nil ) {
            NSLog( @"Doh!" );
        }
        else {
            NSLog(@"Data sent! %@", data);
        }
    }
    else {
         NSLog(@"No connection");
    }

Волшебство должно произойти в этом последнем случае

Любой берущий?Спасибо!

Ответы [ 3 ]

1 голос
/ 26 октября 2011

GPS будет работать без сети, поэтому вы можете хранить каждое полученное вами обновление местоположения.Лучший способ сделать это - в базе данных SQLite с идентификатором, широтой (двойной), долготой и отметкой времени.Возможно, вам понадобится какой-то способ различения сеансов, чтобы вы могли сохранить каждый из них в виде пути.Возможно, вы захотите, чтобы флаг сказал «уже отправил это местоположение на сервер».

Вы можете использовать массив, но вам придется его сохранить.Вы делаете это, записывая лист из массива.Подход SQLite является более надежным.

Этот подход лучше всего будет работать на устройствах с чипом GPS (iPhone, некоторые iPad).Как правило, он не будет работать на устройствах Touches или WiFi (им не нужно подключение, но им нужны WiFi-роутеры, чтобы работать).

0 голосов
/ 14 февраля 2015

Если все, что вы хотите сохранить, это только координаты, то я думаю, что NSUserDefaults было бы самым простым решением для реализации.Есть несколько разных подходов, которые будут работать, вот тот, который хранит все координаты в виде строки, разделенной ; для пар координат и , между долготой и широтой.

- (void)saveCoordinate:(CLLocationCoordinate2D)coordinate {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *previousCoordinatesString = [defaults objectForKey:@"previousCoordinates"];

    NSString *newCoordinatesString;

    // check to see if the string has ever been saved for that key
    if (previousCoordinatesString) {
        newCoordinatesString = [NSString stringWithFormat:@"%@;%f,%f", previousCoordinatesString, coordinate.latitude, coordinate.longitude];
    }

    else {
        newCoordinatesString = [NSString stringWithFormat:@"%f,%f", coordinate.latitude, coordinate.longitude];
    }

    [defaults setObject:newCoordinatesString forKey:@"previousCoordinates"];
}

Для выборкикоординаты, которые были сохранены, извлекают строку из NSUserDefaults и затем анализируют каждую пару координат.Если в пользовательских настройках по умолчанию ничего нет, верните NO.После анализа каждой координаты отправьте ее на сервер.Если устройство не в сети, сохраните строку на потом.

- (BOOL)fetchCoordinates {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *previousCoordinatesString = [defaults objectForKey:@"previousCoordinates"];

    // check to make sure the string exists
    if (!previousCoordinatesString) return NO;

    NSArray *coordinateStringsArray = [previousCoordinatesString componentsSeparatedByString:@";"];
    NSMutableString *coordinatesToSave = [[NSMutableString alloc] init];
    for (NSString *coordinateString in coordinateStringsArray) {
        NSArray *coordinatesArray = [coordinateString componentsSeparatedByString:@","];
        if (coordinatesArray.count > 1) {
            float lattitude = [[coordinatesArray objectAtIndex:0] floatValue];
            float longitude = [[coordinatesArray objectAtIndex:1] floatValue];

            CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(lattitude, longitude);
            if (![self sendCoordinatesToServer:coordinate]) {
                [coordinatesToSave appendFormat:@";%f,%f", lattitude, longitude];
            }
        }
    }

    if (coordinatesToSave.length > 0) {
        [defaults setObject:coordinatesToSave forKey:@"previousCoordinates"];
        return YES;
    }

    return NO;
}

- (BOOL)sendCoordinatesToServer:(CLLocationCoordinate2D)coordinate {
    if (/*check for network connection*/) {
        // send to server
        return YES;
    }

    return NO;
}

Причина разрыва каждой координаты и попытки отправить ее отдельно заключается в том, что она может быть обработана и адаптирована к вашим конкретным потребностям, но если весь набор координат можно отправить в виде строки втогда это будет гораздо лучший вариант с точки зрения мобильных устройств.

0 голосов
/ 27 октября 2011

Похоже, у вас должен быть какой-то другой способ контроля, когда вы отправляете данные, а не оставляете их в руках вашего менеджера местоположения.Вы можете перенести работу из CLLocationManager в другой метод, установленный в таймере или уведомлении, когда есть работа.

...