diff --git a/packages/core/android/src/main/java/com/segment/analytics/reactnative/core/RNAnalyticsModule.kt b/packages/core/android/src/main/java/com/segment/analytics/reactnative/core/RNAnalyticsModule.kt index 8e130413e..78834f636 100644 --- a/packages/core/android/src/main/java/com/segment/analytics/reactnative/core/RNAnalyticsModule.kt +++ b/packages/core/android/src/main/java/com/segment/analytics/reactnative/core/RNAnalyticsModule.kt @@ -28,6 +28,7 @@ import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReactContextBaseJavaModule import com.facebook.react.bridge.ReactMethod import com.facebook.react.bridge.ReadableMap +import com.facebook.react.bridge.Promise import com.segment.analytics.Analytics import com.segment.analytics.Properties import com.segment.analytics.Traits @@ -41,7 +42,7 @@ class RNAnalyticsModule(context: ReactApplicationContext): ReactContextBaseJavaM override fun getName() = "RNAnalytics" @ReactMethod - fun setup(options: ReadableMap) { + fun setup(options: ReadableMap, promise: Promise) { val builder = Analytics .Builder(reactApplicationContext, options.getString("writeKey")) .flushQueueSize(options.getInt("flushAt")) @@ -69,9 +70,14 @@ class RNAnalyticsModule(context: ReactApplicationContext): ReactContextBaseJavaM builder.logLevel(Analytics.LogLevel.VERBOSE) } - Analytics.setSingletonInstance( - RNAnalytics.buildWithIntegrations(builder) - ) + try { + Analytics.setSingletonInstance( + RNAnalytics.buildWithIntegrations(builder) + ) + promise.resolve(true) + } catch(e: Exception) { + promise.reject("E_SEGMENT_ERROR", e) + } } @ReactMethod diff --git a/packages/core/ios/RNAnalytics/RNAnalytics.m b/packages/core/ios/RNAnalytics/RNAnalytics.m index b006d7729..e4c5aed60 100644 --- a/packages/core/ios/RNAnalytics/RNAnalytics.m +++ b/packages/core/ios/RNAnalytics/RNAnalytics.m @@ -32,7 +32,10 @@ +(void)initialize { @synthesize bridge = _bridge; -RCT_EXPORT_METHOD(setup:(NSDictionary*)options) { +RCT_EXPORT_METHOD(setup:(NSDictionary*)options + setupResolver:(RCTPromiseResolveBlock)resolve + setupRejecter:(RCTPromiseRejectBlock)reject) +{ SEGAnalyticsConfiguration* config = [SEGAnalyticsConfiguration configurationWithWriteKey:options[@"writeKey"]]; config.recordScreenViews = [options[@"recordScreenViews"] boolValue]; @@ -46,7 +49,13 @@ +(void)initialize { } [SEGAnalytics debug:[options[@"debug"] boolValue]]; - [SEGAnalytics setupWithConfiguration:config]; + + @try { + [SEGAnalytics setupWithConfiguration:config]; + } + @catch (NSException *exception) { + reject(exception); + } // On iOS we use method swizzling to intercept lifecycle events // However, React-Native calls our library after applicationDidFinishLaunchingWithOptions: is called @@ -60,6 +69,7 @@ +(void)initialize { withObject:_bridge.launchOptions]; } } + resolve(YES); } #define withContext(context) @{@"context": context}