B 站视频
https://www.bilibili.com/vide…
本节目标
- 使用 sentry 平台
- flutter 集成
- android 集成
- ios 集成
正文
错误收集策略
sentry 平台
https://sentry.io
收集 flutter
- 参考
https://docs.sentry.io/platfo…
- pubspec.yaml
dependencies:
sentry: ^3.0.1
- lib/main.dart
// 创建 SentryClient 用于将异常日志上报给 sentry 平台
final SentryClient _sentry = new SentryClient(
dsn:
'https://xxxxxxxxxx',
);
// 是否开发环境
bool get isInDebugMode {return false; // false 开始上传 sentry}
// 上报异常的函数
Future<void> _reportError(dynamic error, dynamic stackTrace) async {print('Caught error: $error');
if (isInDebugMode) {print(stackTrace);
} else {
final SentryResponse response = await _sentry.captureException(
exception: error,
stackTrace: stackTrace,
);
if (response.isSuccessful) {print('Success! Event ID: ${response.eventId}');
} else {print('Failed to report to Sentry.io: ${response.error}');
}
}
}
Future<Null> main() async {
// 捕获并上报 Flutter 异常
FlutterError.onError = (FlutterErrorDetails details) async {if (isInDebugMode == true) {FlutterError.dumpErrorToConsole(details);
} else {Zone.current.handleUncaughtError(details.exception, details.stack);
}
};
// 捕获并上报 Dart 异常
runZonedGuarded(() async {await Global.init();
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider<AppState>.value(value: Global.appState,),
],
child: Consumer<AppState>(builder: (context, appState, _) {if (appState.isGrayFilter) {
return ColorFiltered(colorFilter: ColorFilter.mode(Colors.white, BlendMode.color),
child: NewsApp(),);
} else {return NewsApp();
}
}),
),
);
}, (Object error, StackTrace stack) {_reportError(error, stack);
});
}
收集 android
- 参考
https://docs.sentry.io/platfo…
- 集成 sdk
// ADD JCENTER REPOSITORY
repositories {jcenter()
}
// ADD COMPATIBILITY OPTIONS TO BE COMPATIBLE WITH JAVA 1.8
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
// ADD SENTRY ANDROID AS A DEPENDENCY
dependencies {
// https://github.com/getsentry/sentry-android/releases
implementation 'io.sentry:sentry-android:{version}'
}
- android/app/src/main/AndroidManifest.xml
<application
android:name="io.flutter.app.FlutterApplication"
android:label="猫哥新闻"
android:icon="@mipmap/launcher_icon">
...
<!-- sentry -->
<meta-data android:name="io.sentry.dsn" android:value="xxxxxxxxxxxxxxxxx" />
</application>
- android/app/src/main/kotlin/com/example/flutterducafecatnews/CrashHandler.java
public class CrashHandler implements UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {Sentry.captureException(e);
}
}
- android/app/src/main/kotlin/com/example/flutterducafecatnews/MainActivity.kt
import io.sentry.core.Sentry
class MainActivity: FlutterActivity() {override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {val crashHandler = CrashHandler()
Thread.setDefaultUncaughtExceptionHandler(crashHandler)
GeneratedPluginRegistrant.registerWith(flutterEngine)
}
}
收集 ios
- 资料
https://docs.sentry.io/platfo…
- 集成 CocoaPods
platform :ios, '8.0'
use_frameworks! # This is important
target 'YourApp' do
pod 'Sentry', :git => 'https://github.com/getsentry/sentry-cocoa.git', :tag => '5.1.2'
end
- ios/Runner/AppDelegate.swift
{
SentrySDK.start(options: [
"dsn": "https://xxxxxxxxxxxxxxxxxxx",
"debug": true, // Enabled debug when first installing is always helpful
"enableAutoSessionTracking": true
])
NSSetUncaughtExceptionHandler { exception in
print(exception)
SentrySDK.capture(message: exception.description)
SentrySDK.capture(exception: exception)
}
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
资源
参考
- https://docs.sentry.io/platfo…
- https://docs.sentry.io/platfo…
- https://docs.sentry.io/platfo…
设计稿蓝湖预览
https://lanhuapp.com/url/lYuz1
密码: gSKl
蓝湖现在收费了,所以查看标记还请自己上传 xd 设计稿
商业设计稿文件不好直接分享, 可以加微信联系 ducafecat
代码
https://github.com/ducafecat/…