blob: 02acdebf3e323f9a4b691c3a68d82548d5bf180a [file] [log] [blame]
#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];
[Fabric with:@[ [Crashlytics self] ]];
}
- (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) {
CLS_LOG(@"%@", log);
}
// Set keys.
NSArray *keys = call.arguments[@"keys"];
for (NSDictionary *key in keys) {
if ([@"int" isEqualToString:key[@"type"]]) {
[[Crashlytics sharedInstance] setIntValue:(int)call.arguments[@"value"]
forKey:call.arguments[@"key"]];
} else if ([@"double" isEqualToString:key[@"type"]]) {
[[Crashlytics sharedInstance] setFloatValue:[call.arguments[@"value"] floatValue]
forKey:call.arguments[@"key"]];
} else if ([@"string" isEqualToString:key[@"type"]]) {
[[Crashlytics sharedInstance] setObjectValue:call.arguments[@"value"]
forKey:call.arguments[@"key"]];
} else if ([@"boolean" isEqualToString:key[@"type"]]) {
[[Crashlytics sharedInstance] setBoolValue:[call.arguments[@"value"] boolValue]
forKey:call.arguments[@"key"]];
}
}
// Report crash.
NSArray *errorElements = call.arguments[@"stackTraceElements"];
NSMutableArray *frames = [NSMutableArray array];
for (NSDictionary *errorElement in errorElements) {
[frames addObject:[self generateFrame:errorElement]];
}
[[Crashlytics sharedInstance] recordCustomExceptionName:call.arguments[@"exception"]
reason:call.arguments[@"context"]
frameArray:frames];
result(@"Error reported to Crashlytics.");
} else if ([@"Crashlytics#isDebuggable" isEqualToString:call.method]) {
result([NSNumber numberWithBool:[Crashlytics sharedInstance].debugMode]);
} else if ([@"Crashlytics#getVersion" isEqualToString:call.method]) {
result([Crashlytics sharedInstance].version);
} else if ([@"Crashlytics#setUserEmail" isEqualToString:call.method]) {
[[Crashlytics sharedInstance] setUserEmail:call.arguments[@"email"]];
result(nil);
} else if ([@"Crashlytics#setUserName" isEqualToString:call.method]) {
[[Crashlytics sharedInstance] setUserName:call.arguments[@"name"]];
result(nil);
} else if ([@"Crashlytics#setUserIdentifier" isEqualToString:call.method]) {
[[Crashlytics sharedInstance] setUserEmail:call.arguments[@"identifier"]];
result(nil);
} else {
result(FlutterMethodNotImplemented);
}
}
- (CLSStackFrame *)generateFrame:(NSDictionary *)errorElement {
CLSStackFrame *frame = [CLSStackFrame stackFrame];
frame.library = [errorElement valueForKey:@"class"];
frame.symbol = [errorElement valueForKey:@"method"];
frame.fileName = [errorElement valueForKey:@"file"];
frame.lineNumber = [[errorElement valueForKey:@"line"] intValue];
return frame;
}
@end