diff --git a/index.js b/index.js index d5db21ad..ce6f1467 100644 --- a/index.js +++ b/index.js @@ -458,4 +458,15 @@ export default class OneSignal { RNOneSignal.pauseInAppMessages(pause); } + static getInitialNotification() { + if (!checkIfInitialized()) return; + + //returns a promise + if (Platform.OS === 'android') { + console.log("This function is not supported on Android"); + return + } + return RNOneSignal.getInitialNotification(); + } + } diff --git a/ios/RCTOneSignal/RCTOneSignal.m b/ios/RCTOneSignal/RCTOneSignal.m index 93e0a3ab..3d09a7a5 100644 --- a/ios/RCTOneSignal/RCTOneSignal.m +++ b/ios/RCTOneSignal/RCTOneSignal.m @@ -76,8 +76,8 @@ - (void)didBeginObserving { dispatch_async(dispatch_get_main_queue(), ^{ if (coldStartOSNotificationOpenedResult) { - [self handleRemoteNotificationOpened:[coldStartOSNotificationOpenedResult stringify]]; - coldStartOSNotificationOpenedResult = nil; + NSDictionary *json = [self jsonObjectWithString:[coldStartOSNotificationOpenedResult stringify]]; + [RCTOneSignalEventEmitter setInitialNotification:json]; } }); } diff --git a/ios/RCTOneSignal/RCTOneSignalEventEmitter.h b/ios/RCTOneSignal/RCTOneSignalEventEmitter.h index 78d536eb..135f8728 100644 --- a/ios/RCTOneSignal/RCTOneSignalEventEmitter.h +++ b/ios/RCTOneSignal/RCTOneSignalEventEmitter.h @@ -26,6 +26,7 @@ typedef NS_ENUM(NSInteger, OSNotificationEventTypes) { @interface RCTOneSignalEventEmitter : RCTEventEmitter + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body; ++ (void)setInitialNotification:(NSDictionary *)body; + (BOOL)hasSetBridge; @end diff --git a/ios/RCTOneSignal/RCTOneSignalEventEmitter.m b/ios/RCTOneSignal/RCTOneSignalEventEmitter.m index 7e1791f1..b6baab23 100644 --- a/ios/RCTOneSignal/RCTOneSignalEventEmitter.m +++ b/ios/RCTOneSignal/RCTOneSignalEventEmitter.m @@ -33,6 +33,8 @@ +(BOOL)requiresMainQueueSetup { RCT_EXPORT_MODULE(RCTOneSignal) +NSDictionary* initialNotification; + #pragma mark RCTEventEmitter Subclass Methods -(instancetype)init { @@ -85,6 +87,9 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body { [[NSNotificationCenter defaultCenter] postNotificationName:name object:nil userInfo:body]; } ++ (void)setInitialNotification:(NSDictionary *)body { + initialNotification = body; +} #pragma mark Exported Methods @@ -350,6 +355,23 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body { [OneSignal setExternalUserId:externalId]; } +RCT_REMAP_METHOD(getInitialNotification, + getInitialNotificationWithResolver:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + if (initialNotification) { + resolve(initialNotification); + } else { + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: NSLocalizedString(@"No initial notification", nil), + NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"Initial notification not found", nil) + }; + NSError *error = [NSError errorWithDomain:@"RCTOneSignal" code:1 userInfo:userInfo]; + reject(@"no_initial_notification", @"There was no notification on app opening", error); + } +} + + RCT_EXPORT_METHOD(removeExternalUserId) { [OneSignal removeExternalUserId]; }