app异常上报 swift

2018-03-01 11:11:41 yst19910702 阅读数 1351

找了一些关于bugly的博客,发现这篇比较全。

前言

先说下友盟的SDK,现在真是对友盟没脾气了,分享不正常!三方登录不正常!崩溃分析也不好用!最近所在项目的App,加了直播功能,总是会出现些不可预见的闪退出现,但通过友盟的崩溃统计分析,真心看的云里雾里的,很不方便,分析工具也不够友好,用起来很麻烦。一些朋友、同行都在用Bugly,鉴于Bugly是腾讯旗下的产品,在用过他们的JSPatch后,对腾讯的产品也是好感满满,这里就总结下Bugly的简单使用。
  然后说下符号表对于崩溃分析的重要性,因为虽然很多人在用Bugly,但可能没有用到符号表,导致很多问题没法定位到具体代码。所以,写这篇文章,一是帮自己记录下使用流程及终端命令;二是如果你没用过Bugly,可以帮助你快速上手;三是如果你在用Bugly,但没有使用符号表,可以让你把符号表用起来。但如果这些你都用过,这篇入门文章,就可以不用看了?。

集成

集成很简单,按照官方文档来就好,我们这里建个简单的小项目,模拟一些崩溃,测试下Bugly的bug上报及时性。
  项目就取名叫BuglyDemo了,创建好项目后,去Bugly的控制台,添加我们的应用。

添加应用

  随便填一填就好了。然后我们点击异常上报,查看他的SDK集成方法,这里就不细说了。


  然后在AppDelegate中初始化,OK。

// 头文件
#import <Bugly/Bugly.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    [Bugly startWithAppId:@"此处替换为你的AppId"];
    
    return YES;
}

AppID可以点击你在控制台创建的App,然后点产品设置就能看到了。

Paste_Image.png

Bug上传测试

通过以上的集成及初始化,我们就可以使用了。现在我们创造一个闪退bug,测试下Bugly的bug上传及时性。
  来到ViewController中,在touchBegin中制造一个闪退。以数组越界为例:

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    NSArray *arr = @[@"", @""];
    arr[5];
}

运行项目(iOS10需要允许App进行数据访问),点击屏幕,这时就崩溃了,然后刷新Bugly的控制台,你会发现,bug已经统计到了。所以,Bugly的崩溃上传是在崩溃后立刻上传的,而友盟的bug上传,你需要反复启动几次应用,然后过几分钟才会在控制台看到。

Paste_Image.png

 

  我们点进异常问题中去看一下,崩溃信息大致是这样的,相较于友盟的分析,我们可以很直观的看到崩在哪个方法里了,但想更具体的分析代码位置,就要用到符号表了。

Paste_Image.png

符号表分析

没有符号表,我们就无法定位崩溃中的符号对应的代码所在的类以及类中的行数位置。我们在每次构建版本、debug的时候,都会生成dSYM后缀名的符号表文件,而我们App在手机上运行的时候,崩溃后产生的崩溃信息,不可能定位到代码的多少多少行,因为这些信息对于App运行是没有意义的,存储在App中势必会增大安装包的体积,所以App的崩溃信息都是存储为各种符号,具体符号代表什么,需要去符号表中查找对应的含义。
  我们每次debug、构建版本,都会生成dSYM文件,都对应了一个UUID(像我们的手机一样,都有一个唯一标志),按下图指示,我们就能找到我们所使用的App版本对应的dSYM文件的UUID,通过这个UUID,我们就能找到存储在我们电脑中的dSYM文件,将这个文件上传到bugly,bugly会自动帮我们找到崩溃符号的含义。

Paste_Image.png

 

  需要注意的是,构建版本会自动生成dSYM文件,但debug的时候,是没有的,需要我们手动开启。在build setting中搜索debug,将下面两项内容修改为正确的设置:

Paste_Image.png


  有了符号表的UUID,我们打开终端,按UUID找到符号表的路径。

mdfind "com_apple_xcode_dsym_uuids == A8E87810-70A7-3335-B638-C8B01BE15D79"

后面的一串字母数字组合,就是我们的UUID,这里需要将UUID按一定格式处理下,也就是在特定位置插入“-”,具体格式如下:

 mdfind  "com_apple_xcode_dsym_uuids == 13A1E497-9940-3136-98C0-2130EE432B9D"

 

Paste_Image.png

 

  来到终端,运行上面的命令,就定位到了dSYM文件的位置:

Paste_Image.png


  打开文件路径,就找到了dSYM文件:

Paste_Image.png

 

  拷贝出来,压缩为zip文件,上传到bugly上。

Paste_Image.png


  刷新页面,再回去看刚才的问题,定位到了为ViewController.m的第24行:

Paste_Image.png


  SO,我们的24行做了越界的处理:

Paste_Image.png

其他体验

与友盟比较,Bugly更人性化一些,而且页面更好看写。对于闪退的出现,还提供了如何避免和修复该Bug的一些帮助:

Paste_Image.png


  Bugly也提供热修复功能,当然官方说自己的SDK也是基于JSPatch的,想了解热修复的,可以参考我的这篇文章:JSPatch热修复简单使用
  官网文档也提供了自动上传dSYM文件的操作流程,有兴趣的可以试试,避免以后每次新版本都要手动上传dSYM文件。dSYM文件也可以手动查找:

Paste_Image.png


  找到你构建的版本,右键show in finder:

Paste_Image.png


  然后在定位到的文件上右键显示包内容就OK了:

Paste_Image.png

 

总结

与友盟相比,Bugly在崩溃信息统计方面,优势很明显,除了上面的功能、细节强大,邮件提示、公众号提示,都体现了Bugly的用心。

 

原文链接:https://www.jianshu.com/p/b0afae74d34b

2018-03-23 19:16:27 u013007305 阅读数 5903

一、登录BUGLY官网

1、登录BUGLY官网以后,选择新建产品,选择IOSADNROID平台,如图:

 

完事以后点击保存,点击当前项目查看详细信息:

 

主要有:异常上报(异常概览、崩溃分析、卡顿分析、高级搜索、异常配置)、运营统计(运营概览、用户分析、渠道分析)、应用升级

 

2、选择右上角更多,点击产品设置,查看项目的APP IDAPP KEY,如图:

 

 

3、下载SDK,选择右上角,SKDNDK,符号表工具下载,如图:

 

下载以后进行解压。

二、IOS项目接入SDK(详细请查看官网提供的接入文档和高级功能文档)

1库文件导入

拖拽Bugly.framework文件到Xcode工程内(请勾选Copy items if needed选项),如图:

 

注意添加依赖库

SystemConfiguration.framework

Security.framework

libz.dylib  libz.tbd

libc++.dylib  libc++.tbd

如图:

 

 

4、参数配置:

Bugly支持读取Info.plist文件读取SDK初始化参数,可配置的参数如下:

- Appid - Key: BuglyAppIDString - Value: 字符串类型 -

渠道标识 - Key: BuglyAppChannelString - Value: 字符串类型 -

版本信息 - Key: BuglyAppVersionString - Value: 字符串类型 -

开启Debug信息显示 - Key: BuglyDebugEnable - Value: BOOL类型

如图:


修改添加的名字,必须为以上的key字段,否则无法读取,如图:

 

5、初始化SDK

1.最简单的初始化

导入头文件

在工程的AppDelegate.m文件导入头文件

#import <Bugly/Bugly.h>

如果是Swift工程,请在对应bridging-header.h中导入

详细代码如图所示:

 

初始化方法,[Bugly startWithAppId:@"此处替换为你的AppId"],如图

 

ViewController.mm文件的viewDidLoad方法中加入一个按钮,代码如图:

 

 

错误测试接口代码,如图:

 

点击按钮回调方法,如图:

 

运行如图所示:

 

 

自定义数据将伴随Crash一起上报到Bugly平台,并展示在附件中

 

 

6测试接口

现在您可以制造一个Crash(建议通过按键来触发),来体验Bugly的能力了。在初始化Bugly的之后,调用Bugly测接口。您可以在崩溃页面看到刚才触发的Crash issue了(注意,延迟一般在10s以内)。

点击按钮,调用写的测试代码,代码如图:

 

 

三、后台日志显示

  1、选择上面异常上报,左边点击崩溃分析,数据如图所示:

 

详细错误日志:

 

表明崩溃日志已经上传成功,并且上传了自己定义的数据,以key-value形式。

选择跟踪数据, 查看自定义上传数据:

 

打开crash_attachdotlog.txt,如图所示:

 

2、自定义上传数据:

选择异常上报,错误分析,如图:

 

这表明自定义数据上传成功。

点击去以后的详细信息:

 

 

堆栈日志:

 

3、异常配置

在异常配置中,可以添加告警配置,可以设置发生各种崩溃或错误的概率,然后通知微信,同时每天也会发邮箱Bugly日志简书。

三、上传不成功的解决办法

1、检查这些操作时候正确,如图:

 

2、与其他的一些异常处理器冲突,所以初始化的时候放在其他的初始化后面,最好放在所有初始化完成之后进行Bugly的初始化。

3、如果都没有问题,后台还是收集不到日志,登录到后台,选择右上角更多,产品设置,删除产品,重新创建,然后修改APP ID进行重试,我试了几次不行,这样进行操作以后就可以了,如图:

 

选择删除产品:

 

 

删除成功以后,重新创建新的产品,然后再进行测试。

 

详细文档请参考:https://bugly.qq.com/docs/

 

 欢迎下方留言谈论,或者加入QQ群83459374交流!

 

2017-05-26 15:32:07 C_calary 阅读数 779

前言

一个APP的诞生肯定少不了站在巨人的肩膀上,所以使用这些开源的库,可以让你的开发更加的顺利,快速。如果你想获得更好的阅读体验,请移步简书

网络请求

MVC(Model数据转模型相关)

  • ObjectMapper(Swift)
    Swift中Model数据转模型使用,是MVC架构中绑定数据很有用的框架
    使用方法参考

  • EZSwiftExtensions(OC)
    OC 中数据转模型使用框架,具体用法Github上也有详细的讲解

  • MJExtension(OC)
    转换速度快、使用简单方便的字典转模型框架

  • AlamofireObjectMapper
    配合* ObjectMapper*使用的网络请求扩展

  • MBNetWork
    基于 Alamofire 封装的网络请求库,可以更方便地在视图上展示请求状态。配合Alamofire,ObjectMapper,AlamofireObjectMapper使用

  • HandyJSON(Swift)
    HandyJSON是一个用于Swift语言中的JSON序列化/反序列化库。
    与其他流行的Swift JSON库相比,HandyJSON的特点是,它支持纯swift类,使用也简单。它反序列化时(把JSON转换为Model)不要求Model从NSObject继承(因为它不是基于KVC机制),也不要求你为Model定义一个Mapping函数。只要你定义好Model类,声明它服从HandyJSON协议,HandyJSON就能自行以各个属性的属性名为Key,从JSON串中解析值。

图片加载

界面

动画

刷新

  • MJRefresh(OC)
    上拉加载,下拉刷新,可以自定义实现多种样式

日期选择器

工具

  • TalkingData
    移动数据服务平台,可以对app进行多方面的监测,用于统计数据分析等。
  • 信鸽推送
    顾名思义,是移动App推送平台
  • ShareSDK
    提供社会化功能,集成了一些常用的类库和接口,缩短开发者的开发时间,还有社会化统计分析管理后台,支持包括QQ、微信、新浪微博、腾讯微博等国内外40多家的主流社交平台,帮助开发者轻松实现社会化分享、登录、关注、获得用户资料、获取好友列表等主流的社会化功能。
  • 腾讯Bugly
    腾讯Bugly,为移动开发者提供专业的异常上报,运营统计和内测分发解决方案,帮助开发者快速发现并解决异常,同时掌握产品运营动态,及时跟进用户反馈。

存储相关

  • SwiftyUserDefaults
    对UserDefaults做了进一步的封装,使用起来比较方便。

相机相册图片处理

其他

  • OCR(OC)
    身份证扫描,识别速度特别快,可以快速识别出身份证正反面所有的信息,但是使用了这个框架后就不能用模拟器进行运行程序了,会报错,具体解决办法我也没找到,如果你解决了请留言给我,谢谢。
  • card.io-iOS-SDK
    银行卡识别框架,具体使用参考
  • PPGetAddressBookSwift
    通讯录的处理,可以自己设置通讯录排列样式
  • EZSwiftExtensions
    swift中的各种Extensions,总有方便你使用的
  • KMCGeigerCounter(OC)
    监测app的卡顿情况,具体介绍参考
    注:使用时注意文章最后的PS,加在AppDelegate中会报错的,要加载viewController中
  • MLeaksFinder(OC)
    监测app有无内存泄漏情况,直接导入就可以,不用添加任何代码,在有内存泄露的界面就会弹出窗口提醒。

外链

2016-12-30 14:47:54 Felicity294250051 阅读数 3547

在发布阶段,如果用户的 App 发生了闪退,也就是崩溃了。我们应该如何得知,应该如何有效收集这些崩溃的日志信息。以助于我们的 App 更好的优化。


去 GitHub 下载一个框架:WZYCrash

https://github.com/CoderZYWang/WZYCrash


将 WZYCrash 集成到自己的项目中去。



共有三个类文件:

WZYUncaughtExceptionHandler(捕获崩溃信息),WZYCrashHandler(上传崩溃信息),WZYTools(获取手机型号)


集成完毕后,我们在 AppDelegate.m 中添加如下代码:

//
//  AppDelegate.m
//  WZYCrashDemo
//
//  Created by CoderZYWang on 2016/12/30.
//  Copyright © 2016年 wzy. All rights reserved.
//

#import "AppDelegate.h"

#import "WZYCrashHandler.h"
#import "WZYUncaughtExceptionHandler.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    // 捕获崩溃日志
    [WZYUncaughtExceptionHandler setDefaultHandler];
    // 上传崩溃日志到服务器
    [WZYCrashHandler uploadCrashLog];
    
    return YES;
}

@end


然后我们就可以用我们的代码进行测试,可以先自己写一个小错误然后测试一下是否集成成功。

//
//  ViewController.m
//  WZYCrashDemo
//
//  Created by CoderZYWang on 2016/12/30.
//  Copyright © 2016年 wzy. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    // 测试代码(运行demo时打开)
    // 数组越界错误
//    NSArray *arr = @[@"123"];
//    NSLog(@"%@", arr[3]);
    
    // 再次运行程序,在崩掉之前会有我们的打印信息(str 就是我们收集的错误信息)
    /*
     2016-12-30 14:14:26.883423 WZYCrashDemo[2693:1047098] str ---
     - IDENTIFIER_NUMBER:   6185368C-0054-49C6-8614-F91EA96A5FF3
     - OSVERSION:   10.0.2
     - PHONE_TYPE:   iPhone 6s
     - APP_VERSION:   1.0
     - name:
     NSRangeException
     - reason:
     *** -[__NSSingleObjectArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 0]
     - callStackSymbols:
     0   CoreFoundation                      0x00000001844181d8 <redacted> + 148
     1   libobjc.A.dylib                     0x0000000182e5055c objc_exception_throw + 56
     2   CoreFoundation                      0x0000000184409428 <redacted> + 0
     3   WZYCrashDemo                        0x00000001000d3178 -[ViewController viewDidLoad] + 188
     4   UIKit                               0x000000018a2613dc <redacted> + 1056
     5   UIKit                               0x000000018a260fa4 <redacted> + 28
     6   UIKit                               0x000000018a267750 <redacted> + 76
     7   UIKit                               0x000000018a264bf0 <redacted> + 272
     8   UIKit                               0x000000018a2d7414 <redacted> + 48
     9   UIKit                               0x00000
     */
}

@end


还有疑问的话请参见 GitHub 上面的 Demo。


2017-06-23 11:46:06 jdfkldjlkjdl 阅读数 548

1.概述

腾讯 Bugly,是腾讯公司为移动开发者开放的服务之一,面向移动开发者提供专业的 Crash 监控、崩溃分析等质量跟踪服务。Bugly 能帮助移动互联网开发者更及时地发现掌控异常,更全面的了解定位异常,更高效的修复解决异常。
针对移动应用,腾讯 Bugly 提供了专业的 Crash、Android ANR ( application not response)、iOS 卡顿监控和解决方案。移动开发者 ( Android / iOS ) 可以通过监控,快速发现用户在使用过程中出现的 Crash (崩溃)、Android ANR 和 iOS 卡顿,并根据上报的信息快速定位和解决问题。

2.功能

对产生的问题进行24小时的监控,把握崩溃前后的各个时间节点。Bugly 目前支持 iOS 和 Android 两大主流平台的崩溃分析上报,包括iOS的不同开发语言(Object-C 以及 Swift), 并支持 Android 操作系统的 java 层和 NDK 层全面的崩溃上报。符号还原功能可以帮助开发者定位到具体错误的代码,帮助开发者快速定位问题,修改问题。
Bugly 还支持了不同游戏引擎的脚本层错误上报,对于使用 Cocos 以及 Unity 引擎进行开发的游戏,Bugly的代码还原可以帮助开发这定位到引擎脚本的堆栈,包括 Cocos 的 Lua 脚本,C++ 脚本,以及 Unity 的 C# 脚本。


3.自动集成(推荐)


第一步:集成SDK或者ndk

Bugly支持JCenter仓库Maven Central仓库。为了实现更加灵活的配置,Bugly SDK(2.1.5及以上版本)和NDK(SO库)目前已经分开成两个独立的仓库:

  • SDK:com.tencent.bugly:crashreport
  • NDK:com.tencent.bugly:nativecrashreport

其中,集成Bugly NDK时,需要同时集成Bugly SDK。

集成SDK

在Module的build.gradle文件中添加依赖和属性配置:

dependencies {
    compile 'com.tencent.bugly:crashreport:latest.release' //其中latest.release指代最新Bugly SDK版本号,也可以指定明确的版本号,例如2.2.0
}

同时集成SDK和NDK

在Module的build.gradle文件中添加依赖和属性配置:

android {
    defaultConfig {
        ndk {
            // 设置支持的SO库架构
            abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
        }
    }
}

dependencies {
    compile 'com.tencent.bugly:crashreport:latest.release' //其中latest.release指代最新Bugly SDK版本号,也可以指定明确的版本号,例如2.1.9
    compile 'com.tencent.bugly:nativecrashreport:latest.release' //其中latest.release指代最新Bugly NDK版本号,也可以指定明确的版本号,例如3.0
}

同时集成Bugly SDK和NDK的配置如下图所示,后续更新Bugly SDK和NDK时,只需变更配置脚本中的版本号即可。

Alt text

注意:自动集成时会自动包含Bugly SO库,建议在Module的build.gradle文件中使用NDK的“abiFilter”配置,设置支持的SO库架构。

如果在添加“abiFilter”之后Android Studio出现以下提示:

NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin.

则在项目根目录的gradle.properties文件中添加:

android.useDeprecatedNdk=true


第二步:参数配置

  • 在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_LOGS" />
  • 请避免混淆Bugly,在Proguard混淆文件中增加以下配置:
-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}

第三步:初始化

最简单的初始化

获取APP ID并将以下代码复制到项目Application类onCreate()中,Bugly会为自动检测环境并完成配置:

CrashReport.initCrashReport(getApplicationContext(), "注册时申请的APPID", false); 

为了保证运营数据的准确性,建议不要在异步线程初始化Bugly。

第三个参数为SDK调试模式开关,调试模式的行为特性如下:

  • 输出详细的Bugly SDK的Log;
  • 每一条Crash都会被立即上报;
  • 自定义日志将会在Logcat中输出。

建议在测试阶段建议设置成true,发布时设置为false。


第四步:在bugly官网(https://bugly.qq.com/v2/index)注册自己的APP,得到APP ID,即可完成APP 异常监控。


Bugly官方文档https://bugly.qq.com/docs/user-guide/instruction-manual-android/?v=20170607153855

iOS集成Bugly详解

阅读数 2560