iOS- 集成Bugly详解
SDK 集成
Bugly提供两种集成方式供iOS开发者选择:
- 通过CocoaPods集成
- 手动集成
如果您是从Bugly 2.0
以下版本升级过来的,请查看iOS SDK 升级指南
Bugly iOS SDK 最低兼容系统版本 iOS 7.0
通过CocoaPods集成
在工程的Podfile
里面添加以下代码:
pod 'Bugly'
保存并执行pod install
,然后用后缀为.xcworkspace
的文件打开工程。
注意:
命令行下执行pod search Bugly
,如显示的Bugly
版本不是最新的,则先执行pod repo update
操作更新本地repo的内容
关于CocoaPods
的更多信息请查看 CocoaPods官方网站。
手动集成
- 下载 Bugly iOS SDK
- 拖拽
Bugly.framework
文件到Xcode工程内(请勾选Copy items if needed
选项) - 添加依赖库
SystemConfiguration.framework
Security.framework
libz.dylib
或libz.tbd
libc++.dylib
或libc++.tbd
初始化SDK
导入头文件
在工程的AppDelegate.m
文件导入头文件
#import <Bugly/Bugly.h>
如果是
Swift
工程,请在对应bridging-header.h
中导入
初始化Bugly
在工程AppDelegate.m
的application:didFinishLaunchingWithOptions:
方法中初始化:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[Bugly startWithAppId:@"此处替换为你的AppId"];
return YES;
}
默认Debug模式,是不会生成dSYM文件,需要开启.重新编译CMD+B,修改配置如下图
Bugly后台显示异常数据
dSYM文件
iOS平台中,dSYM文件是指具有调试信息的目标文件,文件名通常为:xxx.app.dSYM。
- 为了方便找回Crash对应的dSYM文件和还原堆栈,建议每次构建或者发布APP版本的时候,备份好dSYM文件。
生成后,在哪里可以找到dSYM文件?
保存log到本地,并上传到Bugly管理后台
1.遵守代理协议
@interface AppDelegate ()<BuglyDelegate>
2.设置代理对象
BuglyConfig *config = [[BuglyConfig alloc] init];
config.delegate = self;
[Bugly startWithAppId:@"你的AppId" config:config];
3.实现代理方法attachmentForException
#pragma mark - Bugly代理 - 捕获异常,回调(@return 返回需上报记录,随 异常上报一起上报)
- (NSString *)attachmentForException:(NSException *)exception {
#ifdef DEBUG // 调试
return [NSString stringWithFormat:@"我是携带信息:%@",[self redirectNSLogToDocumentFolder]];
#endif
return nil;
}
#pragma mark - 保存日志文件
- (NSString *)redirectNSLogToDocumentFolder{
//如果已经连接Xcode调试则不输出到文件
if(isatty(STDOUT_FILENO)) {
return nil;
}
UIDevice *device = [UIDevice currentDevice];
if([[device model] hasSuffix:@"Simulator"]){
//在模拟器不保存到文件中
return nil;
}
//获取Document目录下的Log文件夹,若没有则新建
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *logDirectory = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Log"];
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL fileExists = [fileManager fileExistsAtPath:logDirectory];
if (!fileExists) {
[fileManager createDirectoryAtPath:logDirectory withIntermediateDirectories:YES attributes:nil error:nil];
}
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"]];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; //每次启动后都保存一个新的日志文件中
NSString *dateStr = [formatter stringFromDate:[NSDate date]];
NSString *logFilePath = [logDirectory stringByAppendingFormat:@"/%@.txt",dateStr];
// freopen 重定向输出输出流,将log输入到文件
freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stdout);
freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);
return [[NSString alloc] initWithContentsOfFile:logFilePath encoding:NSUTF8StringEncoding error:nil];
}
Bugly iOS 符号表配置
什么是符号表?
符号表是内存地址与函数名、文件名、行号的映射表。符号表元素如下所示:
<起始地址> <结束地址> <函数> [<文件名:行号>]
为什么要配置符号表?
为了能快速并准确地定位用户APP发生Crash的代码位置,Bugly使用符号表对APP发生Crash的程序堆栈进行解析和还原。
自动配置:XCode + sh脚本
使用文档中的方式一进行配置(默认方式)
配置Xcode编译执行脚本
- 在Xcode工程对应Target的
Build Phases
中新增Run Scrpit Phase
打开工具包中的dSYM_upload.sh
,复制所有内容,在新增的Run Scrpit Phase
中粘贴
修改新增的Run Scrpit中的 <YOUR_APP_ID>
为您的App ID
,<YOUR_APP_KEY>
为您的App Key
,<YOUR_BUNDLE_ID>
为App的Bundle Id
脚本默认在Debug模式及模拟器编译情况下不会上传符号表,在需要上传的时候,请修改下列选项
- Debug模式编译是否上传,1=上传 0=不上传,默认不上传
UPLOAD_DEBUG_SYMBOLS=0
- 模拟器编译是否上传,1=上传 0=不上传,默认不上传