在后台写一个日志文件

时间:2018-03-09 07:59:20

标签: ios objective-c iphone csv nsfilemanager

我正在开发一个使用CLLocationManager来保存GPX曲目的应用程序。另外,我会在*.csv文件上写下调试的位置,但不幸的是,文件只会在记录会话的开始和结束时写入。我猜是因为当用户启动和停止录制时应用程序位于前台,其余时间是在后台。

调用文件写入的代码:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    for (CLLocation *location in locations) {
        if (isDebug || ([location verticalAccuracy] >= 0 && [location horizontalAccuracy] >= 0))
        {
            dispatch_async(dispatch_get_main_queue(), ^{
                NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
                [formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
                [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
                NSString *dateString = [formatter stringFromDate:location.timestamp];
                [Utils writeCompleteGPSWithActivityID:_currentActivity.uniqueIdentifier status:[NSString stringWithFormat:@"%@,%f,%f,%f,%f,%f,%f,%f,0,0\n", dateString, location.coordinate.latitude, location.coordinate.longitude,location.altitude, location.speed, location.course, location.horizontalAccuracy, location.verticalAccuracy]];
            });
        }
    }
}

写一些CSV文件的方法:

+ (void)writeCompleteGPSWithActivityID:(NSString *)activityID status:(NSString *)status
{
    NSString *fileName = [NSString stringWithFormat:@"/%@_ios_completed.csv", activityID];
    NSString *filePath = [[Utils getGPXDirectory] stringByAppendingString:fileName];

    if (fileName == nil)
        return;

    if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]){
        [Utils createCompleteGPSFile:activityID];
    }
    NSFileHandle *fileHandler = [NSFileHandle fileHandleForUpdatingAtPath:filePath];
    [fileHandler seekToEndOfFile];

    [fileHandler writeData:[status dataUsingEncoding:NSUTF8StringEncoding]];
    [fileHandler closeFile];
}

2 个答案:

答案 0 :(得分:0)

如果是这种情况,那么您没有CSV写入问题,则必须在应用程序中启用后台模式。特别是背景位置模式。这将确保您的应用程序即使在启动位置后用户将其置于后台运行。 CSV编写代码无需更改。

希望这有帮助。

答案 1 :(得分:0)

您应该考虑存储在iOS设备上的每个文件都与数据保护类型相关联,以确定何时可以读取和写入文件。

您是否检查了哪个数据保护属性与您尝试写入的文件相关联?

如果设置了保护属性,例如到NSFileProtectionComplete这意味着在设备被锁定时调用fileHandleForUpdatingAtPath将导致空句柄。