在后台写入日志文件

Posted

技术标签:

【中文标题】在后台写入日志文件【英文标题】:Write a log file in background 【发布时间】:2018-03-09 07:59:19 【问题描述】:

我正在开发一个使用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];

【问题讨论】:

您在 Xcode 控制台上遇到了什么样的错误?您的 CSV 代码看起来不错... 我在控制台上没有错误。只是在记录我的 CSV 文件后只有开始和一些结束的记录,我认为在前台应用程序的时间段 【参考方案1】:

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

希望这会有所帮助。

【讨论】:

嗨 vishalv2050,不幸的是,我在后台接收并使用了所有位置,所有应用程序后台模式都像魅力一样工作。唯一的问题是这个编写 CSV 任务... 你怎么知道这个位置工作正常?你有收到的位置点的日志吗? 因为我使用该位置来创建 GPX 文件,而且它的工作原理就像一个魅力。相同的位置将放在 csv 文件上,但它不起作用。唯一的区别是,对于 GPX,我将位置保存在数组中,然后在用户按保存时将其全部保存,对于 csv,每次收到位置时,我都会在 CSV 文件中添加一行。【参考方案2】:

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

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

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

【讨论】:

以上是关于在后台写入日志文件的主要内容,如果未能解决你的问题,请参考以下文章

nohup 后台运行脚本,且可以实时查看日志

linux后台启动springboot并指定日志文件名称

后台工作人员行为怪异?

Python语言--Crontab结合Python脚本实现将日志每天写入到文件中

墨者靶场 phpMyAdmin后台文件包含分析溯源 (CVE-2018-12613)

墨者靶场 phpMyAdmin后台文件包含分析溯源 (CVE-2018-12613)