iOS开发之简单埋点

埋点:监控用户点击的每一步,它不做页面相关的事情而是把用户当前点击的东西,传到服务器达到记录用户点击的每一步。
本片文章主要用两种方式实现该功能:1、通过改变系统中NSLog的输出信息写入到文件中(参考文章)。2、通过自定义方式将数据写入自定义文件夹中。

1、改变系统中NSLog的输出信息写入到文件中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    //制定真机调试保存日志文件
    [self redirectNSlogToDocumentFolder];
    return YES;
}
#pragma mark - 用户方法,将NSLog的输出信息写入到.log文件中
// 将NSLog打印信息保存到Document目录下的文件中
- (void)redirectNSlogToDocumentFolder
{
    //文件路径也可以自定义
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentDirectory = [paths objectAtIndex:0];
    NSString *fileName = [NSString stringWithFormat:@"%@.log",[[NSDate alloc] initWithTimeIntervalSinceNow:8*3600]]; // 注意不是NSData!
    NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:fileName];
    
    //debug模式下,将打印输出流改变。release模式则正常
#ifdef DEBUG
    // 将log输入到文件
    //    "r"表示“只读访问”、"w"表示“只写访问”、"a"表示“追加写入”。
//    使用定向日志后,Xcode控制台将无法输入日志,如果需要在debug模式下在控制台打印日志,可以注掉下面这句代码
    freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);
    NSLog(@"~~~~%@",logFilePath);
#else
    NSLog(@"~~~~%@",logFilePath);
#endif
}

freopen函数(来源度娘)

2、通过自定义方式将数据写入自定义文件夹中

1、关于宏调用自定义的方法

先定义一个宏(可带参数或返回值,也可一无所有)
#define FILELOG_SUPPORT(str) [self redirectNSlogToDocumentFolder:str]
然后在自定义类中写一个同名方法
- (NSString *)redirectNSlogToDocumentFolder:(NSString *)parameter
调用

-(void)click:(UIButton *)btn{
    FILELOG_SUPPORT(@"2222");
    NSString *str = FILELOG_SUPPORT(@"2222");
    NSLog(@"%@",str);
}

2、通过宏调用自定义的写入文件方法实现简单埋点功能

直接上代码

#import "ViewController.h"
#define FILELOG_SUPPORT(str) [self redirectNSlogToDocumentFolder:str]
@interface ViewController ()
@end
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    UIButton *btn = [UIButton new];
    [self.view addSubview:btn];
    btn.backgroundColor = [UIColor redColor];
    btn.frame = CGRectMake(100, 100, 140, 140);
    [btn setTitle:@"客服服务" forState:(UIControlStateNormal)];
//    [btn setImage:[UIImage imageNamed:@"qwas.png"] forState:(UIControlStateNormal)];
    [btn addTarget:self action:@selector(click:) forControlEvents:(UIControlEventTouchUpInside)];
}

-(void)click:(UIButton *)btn{
    FILELOG_SUPPORT(@"2222");
    NSString *str = FILELOG_SUPPORT(@"2222");
    NSLog(@"%@",str);
}

#pragma mark 通过宏调用自定义方法 --- 无参数无返回值的宏,带参数的宏,带返回值的宏,
- (NSString *)redirectNSlogToDocumentFolder:(NSString *)parameter{
    NSLog(@"通过宏定义调用自定义的方法~~~~%@",parameter);
    NSString *strReturn = @"我是返回值";
    
    //需要写入的数据
    NSString *str = @"1234567890";
    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
    [self writeToFolderDirCache:data folder:@"12" file:@"test1"];
    return strReturn;
}

//写入Cache自定义的文件夹中
- (void)writeToFolderDirCache:(NSData *)data folder:(NSString *)folderName file:(NSString *)fileName{
    //创建文件夹
    NSString *documentsPath =[self dirCache];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *testDirectory = [documentsPath stringByAppendingPathComponent:folderName];
    // 创建目录
    NSError *error;
    BOOL res=[fileManager createDirectoryAtPath:testDirectory withIntermediateDirectories:YES attributes:nil error:&error];
    if (res) {
        NSLog(@"文件夹创建成功");
    }else{
        NSLog(@"文件夹创建失败 --- %@",error);
    }
    NSString *FileName=[testDirectory stringByAppendingPathComponent:fileName];
    //写入文件
    [data writeToFile:FileName atomically:YES];
}

//获取Cache目录
-(NSString *)dirCache{
    NSArray *cacPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cachePath = [cacPath objectAtIndex:0];
    NSLog(@"app_home_lib_cache: %@",cachePath);
    return cachePath;
}
@end

关于文件及文件夹的操作参考文件操作demo
测试demo
欢迎指点!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,085评论 1 32
  • 1.不可变数组转变为可变数组声明实例变量的数组 必须记得实现 对于遍历数组找到对象后 如果还需要查找 记得先结束 ...
    小新xin阅读 685评论 0 1
  • 1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现cl...
    以德扶人阅读 2,329评论 2 50
  • 抬头 便望见一道 黏液的 残痕 缓慢移动的银白色身体 向目的所在前行
    一树青桃阅读 163评论 0 1
  • 旅途中会遇到很多人 遇到很多事 但我喜欢看那些烟火气的当地民风 猫和狗是每个地方的标志 有猫的地方很慵懒 有狗的地...
    会写代码的心理师赵征阅读 344评论 0 1