文档章节

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

这里写图片描述

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

本文转载自:

共有 人打赏支持
上一篇: UML用例图总结
法斗斗
粉丝 21
博文 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
让你了解 instruments 模版

在Instruments中,您将使用分析模板来分析您的应用程序(图:1-1)。性能分析模板是一个已经预先配置了仪器和设置的跟踪文档,用于执行常见的跟踪。在启动instruments,创建新文档或从Xcode...

夜空下最亮的亮点
01/03
0
0
如何创建一个纯 Swift 模块

Swift是一门从零开始的创新的编程语言,用于iOS,OS X,watchOS,和tvOS应用的开发,它吸取了C以及Objective-C的优点,且不受C兼容性的限制。Swift采用安全编程模型,并添加了许多新的特性来使...

oschina
2016/03/01
3.7K
7
iOS ZipperDown 漏洞来袭,我们该如何应对?

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

FreeBuf
05/16
0
0
PhoneGap Developer App 1.2.0 发布

PhoneGap Developer App 1.2.0 发布了,新特性包括: iOS 下的摄像头可以工作了 Ajax 请求更好的 CLI 代理支持 Thanks Mr.Br! CLI 控制台日志支持你的终端 完整的记录请看 change log 下载地...

oschina
2014/08/09
2.5K
12

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 钱不还,我就当你人不在了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享Bigleaf的单曲《小鹿》 《小鹿》- Bigleaf 手机党少年们想听歌,请使劲儿戳(这里) 周日在家做什么? 做手工呀, @poorfis...

小小编辑
54分钟前
20
3
EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
今天
17
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
23
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
28
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部