CLLocationManager:没有网络,存储协调并在网络可用时重新发送?

时间:2011-10-25 23:52:28

标签: iphone ios cllocationmanager

我有一个非常简单的CLLocationManager实现。它收集用户坐标,当数据具有适当的距离和准确度时,它会发送到我的服务器。但是,有时没有网络连接。在这些情况下,我需要在本地存储数据,并在连接返回时将rePOST存储到我的服务器。我该怎么做,

答:在本地存储和检索数据?

B:指示CLLocationManager在连接何时返回时重新发送?

皱纹:我在移动目标上不断收集数据,因此我可能需要在数组中存储几个或多个coords,直到网络连接返回。进一步的皱纹:我是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 个答案:

答案 0 :(得分:1)

GPS无需网络即可运行,因此您可以存储收到的每个位置更新。执行此操作的最佳方法是在SQLite数据库中,具有id,纬度(double),经度和时间戳。您可能需要某种方法来区分会话,以便将每个会话存储为路径。您可能需要一个标记来说“已将此位置发送到服务器”。

您可以使用数组,但您必须保存它。您可以通过从数组中编写一个plist来完成此操作。 SQLite方法更强大。

这种方法最适用于带有GPS芯片(iPhone,某些iPad)的设备。它通常在Touches或WiFi iPad上不起作用(它们不需要连接,但它们确实需要WiFi路由器才能工作)。

答案 1 :(得分:0)

听起来您应该在发送数据时使用其他方式进行控制,而不是将其留在位置管理员手中。当有工作要做时,你可以将工作从CLLocationManager推迟到定时器或通知上设置的其他方法。

答案 2 :(得分:0)

如果你想要存储的只是坐标,那么我认为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;
}

分开每个坐标并尝试单独发送它的原因是它可以根据您的特定需求进行处理和调整,但如果一整套坐标可以一次发送为字符串那么那将是一个从移动角度来看,更好的选择。