本文来自微信开发团队yanyang的技术分享。
1.png (26.13 KB, 下载次数: 1221)
下载附件 保存到相册
6 年前 上传
//CP是CrashProtected的简称 @implementation MessageItemView - (void)initContentLabel { m_label = [[MMCPLabel alloc] init]; m_label.cpKey = [MMCPUtil generateKeyWithObject:self.messageModel]; if ([MMCPUtil isUnsafeWithKey:m_label.cpKey]) { // 检测出messageModel消息内容有问题,屏蔽显示 m_label.text = @"该内容无法显示"; } else { m_label.text = self.messageModel.content; } } @end
@implementation MMCPLabel @synthesize cpKey = m_cpKey; // 对常用的排版/绘制接口做检查 - (void)layoutSublayersOfLayer:(CALayer *)layer { CScopedCrashCounter crashCounter(m_cpKey); [super layoutSublayersOfLayer:layer]; } - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { CScopedCrashCounter crashCounter(m_cpKey); [super drawLayer:layer inContext:ctx]; } - (CGSize)sizeThatFits:(CGSize)size { CScopedCrashCounter crashCounter(m_cpKey); return [super sizeThatFits:size]; } @end
// 利用C++特性,在声明C++类临时变量时,会自动执行构造函数,离开作用域会执行析构函数 // 因此构造函数做crashCount+1,析构函数做crashCount-1 class CScopedCrashCounter { public: CScopedCrashCounter(NSString *cpKey) { m_cpKey = cpKey; [MMCPUtil increaseCrashCountWithKey:m_cpKey]; } ~CScopedCrashCounter() { [MMCPUtil decreaseCrashCountWithKey:m_cpKey]; } private: NSString *m_cpKey; }; @implementation MMCPUtil @synthesize crashKeyMemoryMappedKV = m_crashKeyMemoryMappedKV; // 被判定为恶意信息对应的key @synthesize crashCountMemoryMappedKV = m_crashCountMemoryMappedKV; // 每个key crash次数 - (BOOL)isUnsafeWithKey:(NSString *)key { return [m_crashKeyMemoryMappedKV getBoolForKey:key] == YES; } - (void)increaseCrashCountWithKey:(NSString *)key { // 这里记录key所在线程 ... int32_t count = [m_crashCountMemoryMappedKV getInt32ForKey:key]; [m_crashCountMemoryMappedKV setInt32:count + 1 forKey:key] } - (void)decreaseCrashCountWithKey:(NSString *)key { int32_t count = [m_crashCountMemoryMappedKV getInt32ForKey:key]; [m_crashCountMemoryMappedKV setInt32:MAX(0, count - 1) forKey:key]; } // crash回调函数 - (void)onSignalCrash:(siginfo_t *)info { // 先找到跟crash线程相同的key NSString *key = [self lastCPKey:info->si_pid]; if (key == nil) return; if (m_isLastTimeCrashedBySpecialCharacter == NO) { // 设置当前是特殊字符引起的闪退,如果crash次数大于1,则屏蔽这字符串显示 [self setLastTimeCrashedBySpecialCharacter:YES]; if ([m_crashCountMemoryMappedKV getInt32ForKey:key] > 1) { [m_crashKeyMemoryMappedKV setBool:YES forKey:key]; } } else { // 连续特殊字符闪退,直接屏蔽 [m_crashKeyMemoryMappedKV setBool:YES forKey:key]; } } @end
2.jpeg (45.36 KB, 下载次数: 1223)
3.png (17.85 KB, 下载次数: 1152)
来源:即时通讯网 - 即时通讯开发者社区!
轻量级开源移动端即时通讯框架。
快速入门 / 性能 / 指南 / 提问
轻量级Web端即时通讯框架。
详细介绍 / 精编源码 / 手册教程
移动端实时音视频框架。
详细介绍 / 性能测试 / 安装体验
基于MobileIMSDK的移动IM系统。
详细介绍 / 产品截图 / 安装体验
一套产品级Web端IM系统。
详细介绍 / 产品截图 / 演示视频
精华主题数超过100个。
连续任职达2年以上的合格正式版主
为论区做出突出贡献的开发者、版主等。
Copyright © 2014-2024 即时通讯网 - 即时通讯开发者社区 / 版本 V4.4
苏州网际时代信息科技有限公司 (苏ICP备16005070号-1)
Processed in 0.109375 second(s), 38 queries , Gzip On.