文档章节

iOS 文件操作,记录log日志。 

法斗斗
 法斗斗
发布于 2016/11/10 19:36
字数 1040
阅读 27
收藏 0

iOS 文件操作,记录log日志。 

先把需求发一下:

•   客户端以日志的形式,记录用户的基本信息、使用环境、使用行为等数据。

上报策略

•   程序进入后台模式时,立即上传缓存的日志文件
•   按照时间,以每小时的频率进行数据上报
•   日志文件小于30KB时,不进行上报
•   上报成功后,清除已上传成功的日志文件
•   特殊上报策略——客户端启动触发的事件,实时上报

这里只介绍怎么对文件进行操作。

  1. 因为全局任何时刻都有可能会写入日志,并且有可能会存储好几个用户的日志。所以我用了单例写,并且有个属性记录下了当前操作的文件路径。那么先来写个单例。
@property (nonatomic,strong)NSString * filePath;//当前操作的文件的路径
@property (nonatomic,strong)dispatch_queue_t concurrentWriteFileQueue;//自己创建的一个线程
 - (instancetype) shareInstance{
    static dispatch_once_t onceToken;
    static UserInfoCollection *UIC = nil;
    //确保创建单例只被执行一次。
    dispatch_once(&onceToken, ^{
        UIC = [UserInfoCollection new];
       //自己建立一个线程
        UIC.concurrentWriteFileQueue = dispatch_queue_create("人家是写文件的线程自定义队列", DISPATCH_QUEUE_CONCURRENT);
    });
    return UIC;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 创建文件。
  (void)createFileWithUID:(NSString*)UID{
// 文件存储的路径,
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString * documentDirectory = [paths objectAtIndex:0];
    NSLog(@"%@",documentDirectory);

    NSFileManager *manager = [NSFileManager defaultManager];
// 路径下的所有文件名

    NSArray *filePathArr = [manager contentsOfDirectoryAtPath:[NSString stringWithFormat:@"%@/",documentDirectory] error:nil];
    NSLog(@"arr = %@",filePathArr);
//    用UID 匹配文件 如果已经有了某个用户的日志,那么就返回这个用户的文件路径,不创建新的。
    for (NSString * file in filePathArr) {
        if ([file rangeOfString:[NSString stringWithFormat:@"%@_",UID]].location != NSNotFound) {
//            已经有了文件,
//UIC.filePath 当前操作的文件的路径
            UIC.filePath = [NSString stringWithFormat:@"%@/%@",documentDirectory,file];
            return;
        }
    }

    //首次创建文件名
    NSString *testPath = [NSString stringWithFormat:@"%@/%@_%@_%@%@",documentDirectory,UID,@"设备号",@"时间戳",@".txt"];

    BOOL ifFileExist = [manager fileExistsAtPath:testPath];
    BOOL success = NO;
    if (ifFileExist) {
        NSLog(@"文件已经存在");
        UIC.filePath = testPath;
    }else{
        NSLog(@"文件不存在");
        success = [manager createFileAtPath:testPath contents:nil attributes:nil];
    }

    if (!success) {
        NSLog(@"创建文件不成功");
        UIC.filePath = nil;
//        错误判断+++
    }else{
        NSLog(@"创建文件成功");
        UIC.filePath = testPath;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 文件写入
- (void)writeMessageToFileWithJsonStr:(NSDictionary*)dic{
    if (!UIC.filePath) {
        NSLog(@"文件路径错误,写不进去");
        return;
    }

    NSFileHandle *file = [NSFileHandle fileHandleForUpdatingAtPath:UIC.filePath];
// 字典转JSON
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
    NSString *json = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    NSString *jsonStr = [json stringByAppendingString:@",\n"];

// 在文件的末尾添加内容。如果想在开始写 [file seekToFileOffset:0];
    [file seekToEndOfFile];
    NSData *strData = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
    [file writeData:strData ];

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 计算文件的大小
//文件大小
- (float)fileSize{
    NSFileManager *manager = [NSFileManager defaultManager];
     return  [[manager attributesOfItemAtPath:UIC.filePath error:nil] fileSize]/(1024.0);//这里返回的单位是KB
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 删除文件
- (void)deleteUserInfoFile{
     dispatch_barrier_async(UIC.concurrentWriteFileQueue, ^{
    NSFileManager *manager = [NSFileManager defaultManager];
   BOOL deleSuccess = [manager removeItemAtPath:UIC.filePath error:nil];
    if (deleSuccess) {
        NSLog(@"删除文件成功");
    }else{
        NSLog(@"删除文件不成功");
    }
     });

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 创建文件并写入一些信息
- (void)userInfoWithUID:(NSString*)UID{

  //添加写操作到自定义队列,当稍后执行时,这将是队列中唯一执行的条目。这个Block永远不会同时和其他Block一起在队列中执行
  dispatch_barrier_async(UIC.concurrentWriteFileQueue, ^{
        [UIC createFileWithUID:UID];

        NSDictionary *dic = @{
                              @"u":@{
                                      @"uid":UID,//
                                      @"device":@"设备号",
                                      @"brand":@"设备信息",
                                      @"os":@"设备操作系统信息",
                                      @"tag":@"客户端发布渠道",
                                      @"clienttype":@"iPhone",
                                      @"version":@"x.x.xxxx"
                                      }
                              };

        [self writeMessageToFileWithJsonStr:dic];


    });



}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

这里写图片描述

自定义一个线程队列,比较方便调试 。 
最后是写好的文件。 
这里写图片描述

本文转载自:

共有 人打赏支持
法斗斗
粉丝 20
博文 367
码字总数 17774
作品 0
杨浦
程序员
获取iOS设备上崩溃日志(Crash Log)的方法

获取iOS设备上崩溃日志(Crash Log)的方法:http://www.weste.net/2013/5-20/91509.html iOS怎么分析AppStore上面的Crash Log:http://m.blog.csdn.net/blog/tianjf0514/45201549 iOS Cra......

智能小松鼠
2015/08/25
0
0
iOS ZipperDown 漏洞来袭,我们该如何应对?

  昨天傍晚盘古实验室负责任的披露了针对 iOS 应用的 ZipperDown 漏洞,并提供了检索、查询受影响应用的平台: zipperdown.com。基于目前公开的信息,该漏洞的影响面比较大,15000 多个应用...

FreeBuf
05/16
0
0
iOS 性能优化 Instruments 检测 App 耗电量实战

资本需求推动开发轮子。上个月,接收到用户反馈,用着我们的 App,尤其是物流模块的司机端耗电量特别大,看下有什么办法可以进行性能优化?从问题看,只能猜测到 CPU 开销比较大或者地理位置...

Maxdon
07/25
0
0
iOS按钮倒计时在进入后台不继续计时的处理

iOS程序进入后台后十分钟之内就会被系统kill掉,我想要程序进入后台后仍然运行计时功能,怎么解决呢? 方法一:可以使用记录开始时间和获取当前时间的时间差进行处理 还是直接上代码: 下面的...

云上飞飞
07/06
0
0
关于 fir.im 你可能不知道的实用小工具

大家可能都知道 fir.im 是做测试发包的,上传你的 IPA/APK, 测试用户可以通过一个短链接和二维码就可快速安装测试。 除了基本的发包功能即应用上传下载外,fir.im 还为提高发包体验提供了一系...

风起云飞fir_im
2015/11/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL 到底支不支持事务嵌套?

最近开发中遇到了使用MySQL,多次开启事务,出现了数据错乱问题,伪代码如下: begin; # 操作1 begin; # 操作2 rollback; 执行完后出现了操作1的数据真正写入,只有操作2的数据回滚...

宇润
今天
7
0
fastDfs应用(安装过程待写)

1.效果 2.安装 2.1 导入已经安装好fastDFS的镜像 2.1.1 导入镜像 2.1.2 更改系统兼容性 2.1.3 开机 2.1.4 修改 一下内容 2.1.4.1 修改系统的ip 原来系统ip...

Lucky_Me
今天
5
0
5. Python3源码—字符串(str)对象

5.1. 字符串对象 字符串对象是“变长对象”。 5.1.1. Python中的创建 Python中字符串(strs)对象最重要的创建方法为PyUnicode_DecodeUTF8Stateful,如下Python语句最终会调用到PyUnicode_D...

Mr_zebra
今天
5
0
第十章:路由网关(Zuul)进阶:过滤器、异常处理

第十章:路由网关(Zuul)进阶:过滤器、异常处理 简单介绍了关于Zuul的一些简单使用以及一些路由规则的简单说明。而对于一个统一网关而言,需要处理各种各类的请求,对不同的url进行拦截,或者...

DemonsI
今天
4
0
nginx屏蔽指定接口(URL)

Step1:需求 web平台上线后,需要屏蔽某个服务接口,但又不想重新上线,可以采用nginx屏蔽指定平台接口的办法 Step2:具体操作 location /dist/views/landing/UNIQUE_BEACON_URL { re...

Linux_Anna
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部