forked from firebase/flutterfire
-
Notifications
You must be signed in to change notification settings - Fork 2
/
FirebaseCrashlyticsPlugin.m
94 lines (78 loc) · 3.16 KB
/
FirebaseCrashlyticsPlugin.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "FirebaseCrashlyticsPlugin.h"
#import <Firebase/Firebase.h>
@interface FirebaseCrashlyticsPlugin ()
@property(nonatomic, retain) FlutterMethodChannel *channel;
@end
@implementation FirebaseCrashlyticsPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar {
FlutterMethodChannel *channel =
[FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/firebase_crashlytics"
binaryMessenger:[registrar messenger]];
FirebaseCrashlyticsPlugin *instance = [[FirebaseCrashlyticsPlugin alloc] init];
[registrar addMethodCallDelegate:instance channel:channel];
SEL sel = NSSelectorFromString(@"registerLibrary:withVersion:");
if ([FIRApp respondsToSelector:sel]) {
[FIRApp performSelector:sel withObject:LIBRARY_NAME withObject:LIBRARY_VERSION];
}
}
- (instancetype)init {
self = [super init];
if (self) {
if (![FIRApp defaultApp]) {
[FIRApp configure];
}
}
return self;
}
- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result {
if ([@"Crashlytics#onError" isEqualToString:call.method]) {
// Add logs.
NSArray *logs = call.arguments[@"logs"];
for (NSString *log in logs) {
[[FIRCrashlytics crashlytics] logWithFormat:@"%@", log];
}
// Set keys.
NSDictionary *keys = call.arguments[@"keys"];
for (NSString *key in keys) {
[[FIRCrashlytics crashlytics] setCustomValue:keys[key] forKey:key];
}
// Add additional information from the Flutter framework to the exception reported in
// Crashlytics.
NSString *information = call.arguments[@"information"];
if ([information length] != 0) {
[[FIRCrashlytics crashlytics] logWithFormat:@"%@", information];
}
// Report crash.
NSArray *errorElements = call.arguments[@"stackTraceElements"];
NSMutableArray *frames = [NSMutableArray array];
for (NSDictionary *errorElement in errorElements) {
[frames addObject:[self generateFrame:errorElement]];
}
NSString *context = call.arguments[@"context"];
NSString *reason;
if (context != nil) {
reason = [NSString stringWithFormat:@"thrown %@", context];
}
FIRExceptionModel *exception =
[FIRExceptionModel exceptionModelWithName:call.arguments[@"exception"] reason:reason];
exception.stackTrace = frames;
[[FIRCrashlytics crashlytics] recordExceptionModel:exception];
result(@"Error reported to Crashlytics.");
} else if ([@"Crashlytics#setUserIdentifier" isEqualToString:call.method]) {
[[FIRCrashlytics crashlytics] setUserID:call.arguments[@"identifier"]];
result(nil);
} else {
result(FlutterMethodNotImplemented);
}
}
- (FIRStackFrame *)generateFrame:(NSDictionary *)errorElement {
FIRStackFrame *frame =
[FIRStackFrame stackFrameWithSymbol:[errorElement valueForKey:@"method"]
file:[errorElement valueForKey:@"file"]
line:[[errorElement valueForKey:@"line"] intValue]];
return frame;
}
@end