Crash reporter plugin
Summary: iOS side of crash reporter plugin Reviewed By: jknoxville Differential Revision: D13176725 fbshipit-source-id: be104958c5e26aa67709a33ef43c0b99600ca2b7
This commit is contained in:
committed by
Facebook Github Bot
parent
543bc6c4fb
commit
d475a50f2a
@@ -156,4 +156,13 @@ Pod::Spec.new do |spec|
|
|||||||
ss.source_files = "iOS/Plugins/FlipperKitExamplePlugin/**/*.{h,mm}"
|
ss.source_files = "iOS/Plugins/FlipperKitExamplePlugin/**/*.{h,mm}"
|
||||||
ss.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)\"/Headers/Private/FlipperKit/**" }
|
ss.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)\"/Headers/Private/FlipperKit/**" }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
spec.subspec "FlipperKitCrashReporterPlugin" do |ss|
|
||||||
|
ss.header_dir = "FlipperKitCrashReporterPlugin"
|
||||||
|
ss.dependency 'FlipperKit/Core'
|
||||||
|
ss.compiler_flags = folly_compiler_flags
|
||||||
|
ss.public_header_files = 'iOS/Plugins/FlipperKitCrashReporterPlugin/FlipperKitCrashReporterPlugin.h'
|
||||||
|
ss.source_files = "iOS/Plugins/FlipperKitCrashReporterPlugin/**/*.{h,mm}"
|
||||||
|
ss.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)\"/Headers/Private/FlipperKit/**" }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Facebook, Inc.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#if FB_SONARKIT_ENABLED
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <FlipperKit/FlipperPlugin.h>
|
||||||
|
|
||||||
|
@interface FlipperKitCrashReporterPlugin : NSObject<FlipperPlugin>
|
||||||
|
- (instancetype)init NS_UNAVAILABLE;
|
||||||
|
+ (instancetype) sharedInstance;
|
||||||
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018-present, Facebook, Inc.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the LICENSE
|
||||||
|
* file in the root directory of this source tree.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#if FB_SONARKIT_ENABLED
|
||||||
|
#import "FlipperKitCrashReporterPlugin.h"
|
||||||
|
#import <FlipperKit/FlipperConnection.h>
|
||||||
|
|
||||||
|
@interface FlipperKitCrashReporterPlugin()
|
||||||
|
@property (strong, nonatomic) id<FlipperConnection> connection;
|
||||||
|
@property (assign, nonatomic) NSUInteger notificationID;
|
||||||
|
@property (assign, nonatomic) NSUncaughtExceptionHandler *prevHandler;
|
||||||
|
- (void) handleException:(NSException *)exception;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
void flipperkitUncaughtExceptionHandler(NSException *exception) {
|
||||||
|
NSLog(@"CRASH: %@", exception);
|
||||||
|
NSLog(@"Stack Trace: %@", [exception callStackSymbols]);
|
||||||
|
[[FlipperKitCrashReporterPlugin sharedInstance] handleException:exception];
|
||||||
|
}
|
||||||
|
|
||||||
|
@implementation FlipperKitCrashReporterPlugin
|
||||||
|
|
||||||
|
- (instancetype)init {
|
||||||
|
if (self = [super init]) {
|
||||||
|
_connection = nil;
|
||||||
|
_notificationID = 0;
|
||||||
|
_prevHandler = NSGetUncaughtExceptionHandler();
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (instancetype)sharedInstance {
|
||||||
|
static FlipperKitCrashReporterPlugin *sInstance = nil;
|
||||||
|
|
||||||
|
static dispatch_once_t onceToken;
|
||||||
|
dispatch_once(&onceToken, ^{
|
||||||
|
sInstance = [FlipperKitCrashReporterPlugin new];
|
||||||
|
});
|
||||||
|
|
||||||
|
return sInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSString *)identifier {
|
||||||
|
return @"CrashReporter";
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) handleException:(NSException *)exception {
|
||||||
|
// TODO: Rather than having indirection from c function, somehow pass objective c selectors as a c function pointer to NSSetUncaughtExceptionHandler
|
||||||
|
self.notificationID += 1;
|
||||||
|
[self.connection send:@"crash-report" withParams:@{@"reason": [exception reason], @"name": [exception name], @"callstack": [exception callStackSymbols]}];
|
||||||
|
if (self.prevHandler) {
|
||||||
|
self.prevHandler(exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)didConnect:(id<FlipperConnection>)connection {
|
||||||
|
self.connection = connection;
|
||||||
|
NSSetUncaughtExceptionHandler(&flipperkitUncaughtExceptionHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)didDisconnect {
|
||||||
|
self.connection = nil;
|
||||||
|
NSSetUncaughtExceptionHandler(self.prevHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)runInBackground {
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
#endif
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#import "AppDelegate.h"
|
#import "AppDelegate.h"
|
||||||
|
#import <FlipperKitCrashReporterPlugin/FlipperKitCrashReporterPlugin.h>
|
||||||
#import <FlipperKit/FlipperClient.h>
|
#import <FlipperKit/FlipperClient.h>
|
||||||
#import <FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.h>
|
#import <FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.h>
|
||||||
#import <FlipperKitNetworkPlugin/FlipperKitNetworkPlugin.h>
|
#import <FlipperKitNetworkPlugin/FlipperKitNetworkPlugin.h>
|
||||||
@@ -38,6 +38,7 @@
|
|||||||
withDescriptorMapper: layoutDescriptorMapper]];
|
withDescriptorMapper: layoutDescriptorMapper]];
|
||||||
|
|
||||||
[client addPlugin:[[FKUserDefaultsPlugin alloc] initWithSuiteName:nil]];
|
[client addPlugin:[[FKUserDefaultsPlugin alloc] initWithSuiteName:nil]];
|
||||||
|
[client addPlugin:[FlipperKitCrashReporterPlugin sharedInstance]];
|
||||||
|
|
||||||
[[FlipperClient sharedClient] addPlugin: [[FlipperKitNetworkPlugin alloc] initWithNetworkAdapter:[SKIOSNetworkAdapter new]]];
|
[[FlipperClient sharedClient] addPlugin: [[FlipperKitNetworkPlugin alloc] initWithNetworkAdapter:[SKIOSNetworkAdapter new]]];
|
||||||
[client addPlugin:[FlipperKitExamplePlugin sharedInstance]];
|
[client addPlugin:[FlipperKitExamplePlugin sharedInstance]];
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14313.18" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||||
<device id="retina4_7" orientation="portrait">
|
<device id="retina4_7" orientation="portrait">
|
||||||
<adaptation id="fullscreen"/>
|
<adaptation id="fullscreen"/>
|
||||||
</device>
|
</device>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="iOS"/>
|
<deployment identifier="iOS"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14283.14"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
|
||||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
@@ -259,6 +259,9 @@
|
|||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
|
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="sonarpattern" translatesAutoresizingMaskIntoConstraints="NO" id="ytS-7A-bty">
|
||||||
|
<rect key="frame" x="0.0" y="20" width="375" height="647"/>
|
||||||
|
</imageView>
|
||||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="WSh-CB-RQ8">
|
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="WSh-CB-RQ8">
|
||||||
<rect key="frame" x="40" y="257.5" width="295" height="152"/>
|
<rect key="frame" x="40" y="257.5" width="295" height="152"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
@@ -319,9 +322,6 @@
|
|||||||
<constraint firstItem="Fel-3h-2Ts" firstAttribute="top" secondItem="cp1-5I-XfA" secondAttribute="bottom" constant="8" id="sAQ-IL-GiU"/>
|
<constraint firstItem="Fel-3h-2Ts" firstAttribute="top" secondItem="cp1-5I-XfA" secondAttribute="bottom" constant="8" id="sAQ-IL-GiU"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</view>
|
</view>
|
||||||
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="sonarpattern" translatesAutoresizingMaskIntoConstraints="NO" id="ytS-7A-bty">
|
|
||||||
<rect key="frame" x="0.0" y="20" width="375" height="647"/>
|
|
||||||
</imageView>
|
|
||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ target 'Sample' do
|
|||||||
pod 'FlipperKit/SKIOSNetworkPlugin', :path => '../../FlipperKit.podspec'
|
pod 'FlipperKit/SKIOSNetworkPlugin', :path => '../../FlipperKit.podspec'
|
||||||
pod 'FlipperKit/FlipperKitUserDefaultsPlugin', :path => '../../FlipperKit.podspec'
|
pod 'FlipperKit/FlipperKitUserDefaultsPlugin', :path => '../../FlipperKit.podspec'
|
||||||
pod 'FlipperKit/FlipperKitExamplePlugin', :path => '../../FlipperKit.podspec'
|
pod 'FlipperKit/FlipperKitExamplePlugin', :path => '../../FlipperKit.podspec'
|
||||||
|
pod 'FlipperKit/FlipperKitCrashReporterPlugin', :path => '../../FlipperKit.podspec'
|
||||||
pod 'Flipper', :path => '../../Flipper.podspec'
|
pod 'Flipper', :path => '../../Flipper.podspec'
|
||||||
post_install do |installer|
|
post_install do |installer|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user