Skip to content

Commit 99fae65

Browse files
authored
Merge pull request #512 from geektimecoil/init_race_condition
Initialization Race Condition Fix
2 parents f3e036d + 2ba800a commit 99fae65

File tree

6 files changed

+71
-28
lines changed

6 files changed

+71
-28
lines changed

ios/RCTOneSignal.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
CA3D8B592076D83C006F3572 /* RCTOneSignalExtensionService.h in Headers */ = {isa = PBXBuildFile; fileRef = CA1CC866200FE3C3005B66AA /* RCTOneSignalExtensionService.h */; };
1515
CA3D8B5A2076D84E006F3572 /* RCTOneSignal.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = FDB40CC21C5E4E5500CBF09B /* RCTOneSignal.h */; };
1616
CA3D8B5B2076D84E006F3572 /* RCTOneSignalExtensionService.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = CA1CC866200FE3C3005B66AA /* RCTOneSignalExtensionService.h */; };
17+
CA63F32E20ACFD60009AE90F /* UIApplication+RCTOnesignal.m in Sources */ = {isa = PBXBuildFile; fileRef = CA63F32C20ACFD60009AE90F /* UIApplication+RCTOnesignal.m */; };
1718
CACB39D6202D232A00D86CD1 /* RCTOneSignalEventEmitter.m in Sources */ = {isa = PBXBuildFile; fileRef = CACB39D5202D232A00D86CD1 /* RCTOneSignalEventEmitter.m */; };
1819
FD2CCC851C772B4200B2B24E /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FD2CCC841C772B4200B2B24E /* SystemConfiguration.framework */; };
1920
FDB40CC41C5E4E5500CBF09B /* RCTOneSignal.m in Sources */ = {isa = PBXBuildFile; fileRef = FDB40CC31C5E4E5500CBF09B /* RCTOneSignal.m */; };
@@ -40,6 +41,7 @@
4041
CA1CC867200FE3C3005B66AA /* RCTOneSignalExtensionService.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTOneSignalExtensionService.m; sourceTree = "<group>"; };
4142
CA362AF5209927E20095B77A /* libOneSignal.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libOneSignal.a; sourceTree = "<group>"; };
4243
CA362AF6209927E20095B77A /* OneSignal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OneSignal.h; sourceTree = "<group>"; };
44+
CA63F32C20ACFD60009AE90F /* UIApplication+RCTOnesignal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIApplication+RCTOnesignal.m"; sourceTree = "<group>"; };
4345
CACB39D4202D232A00D86CD1 /* RCTOneSignalEventEmitter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTOneSignalEventEmitter.h; sourceTree = "<group>"; };
4446
CACB39D5202D232A00D86CD1 /* RCTOneSignalEventEmitter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RCTOneSignalEventEmitter.m; sourceTree = "<group>"; };
4547
FD2CCC841C772B4200B2B24E /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; };
@@ -87,6 +89,7 @@
8789
CACB39D5202D232A00D86CD1 /* RCTOneSignalEventEmitter.m */,
8890
CA1CC866200FE3C3005B66AA /* RCTOneSignalExtensionService.h */,
8991
CA1CC867200FE3C3005B66AA /* RCTOneSignalExtensionService.m */,
92+
CA63F32C20ACFD60009AE90F /* UIApplication+RCTOnesignal.m */,
9093
);
9194
path = RCTOneSignal;
9295
sourceTree = "<group>";
@@ -171,6 +174,7 @@
171174
buildActionMask = 2147483647;
172175
files = (
173176
CACB39D6202D232A00D86CD1 /* RCTOneSignalEventEmitter.m in Sources */,
177+
CA63F32E20ACFD60009AE90F /* UIApplication+RCTOnesignal.m in Sources */,
174178
CA1CC868200FE3C3005B66AA /* RCTOneSignalExtensionService.m in Sources */,
175179
FDB40CC41C5E4E5500CBF09B /* RCTOneSignal.m in Sources */,
176180
);

ios/RCTOneSignal/RCTOneSignal.m

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,6 @@ @implementation RCTOneSignal {
3131
BOOL didInitialize;
3232
}
3333

34-
+(void)load {
35-
static dispatch_once_t onceToken;
36-
dispatch_once(&onceToken, ^{
37-
[[RCTOneSignal sharedInstance] initOneSignal];
38-
});
39-
}
40-
4134
OSNotificationOpenedResult* coldStartOSNotificationOpenedResult;
4235

4336
+ (RCTOneSignal *) sharedInstance {

ios/RCTOneSignal/RCTOneSignalEventEmitter.m

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,3 @@
1-
//
2-
// RCTOneSignalEventEmitter.m
3-
// RCTOneSignal
4-
//
5-
// Created by Brad Hesse on 2/8/18.
6-
//
7-
81
#import "RCTOneSignalEventEmitter.h"
92
#if __has_include(<OneSignal/OneSignal.h>)
103
#import <OneSignal/OneSignal.h>

ios/RCTOneSignal/RCTOneSignalExtensionService.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,3 @@
1-
//
2-
// RCTOneSignalExtensionService.h
3-
// RCTOneSignal
4-
//
5-
// Created by Brad Hesse on 1/17/18.
6-
//
7-
81
#import <Foundation/Foundation.h>
92
#import <UserNotifications/UserNotifications.h>
103

ios/RCTOneSignal/RCTOneSignalExtensionService.m

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,3 @@
1-
//
2-
// RCTOneSignalExtensionService.m
3-
// RCTOneSignal
4-
//
5-
// Created by Brad Hesse on 1/17/18.
6-
//
7-
81
#if __has_include(<OneSignal/OneSignal.h>)
92
#import <OneSignal/OneSignal.h>
103
#else
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#import <UIKit/UIKit.h>
2+
#import <objc/runtime.h>
3+
4+
@interface RCTOneSignal
5+
+ (RCTOneSignal *) sharedInstance;
6+
- (void)initOneSignal;
7+
@end
8+
9+
@implementation UIApplication(OneSignalReactNative)
10+
11+
/*
12+
This UIApplication category ensures that OneSignal init() gets called at least one time
13+
14+
If this did not occur, cold-start notifications would not trigger the React-Native 'opened'
15+
event and other miscellaneous problems would occur.
16+
17+
First, we swizzle UIApplication's setDelegate method, to get notified when the app delegate
18+
is assigned. Then we swizzle UIApplication's didFinishLaunchingWithOptions() method. When
19+
this method gets called, it initializes the OneSignal SDK with a nil app ID.
20+
*/
21+
22+
//helper method to swizzle instance methods
23+
static void injectSelector(Class newClass, SEL newSel, Class addToClass, SEL makeLikeSel) {
24+
Method newMeth = class_getInstanceMethod(newClass, newSel);
25+
IMP imp = method_getImplementation(newMeth);
26+
const char* methodTypeEncoding = method_getTypeEncoding(newMeth);
27+
28+
BOOL successful = class_addMethod(addToClass, makeLikeSel, imp, methodTypeEncoding);
29+
if (!successful) {
30+
class_addMethod(addToClass, newSel, imp, methodTypeEncoding);
31+
newMeth = class_getInstanceMethod(addToClass, newSel);
32+
33+
Method orgMeth = class_getInstanceMethod(addToClass, makeLikeSel);
34+
35+
method_exchangeImplementations(orgMeth, newMeth);
36+
}
37+
}
38+
39+
//gets called by the ObjC runtime early in the app lifecycle
40+
+ (void)load {
41+
static dispatch_once_t onceToken;
42+
dispatch_once(&onceToken, ^{
43+
method_exchangeImplementations(class_getInstanceMethod(self, @selector(setDelegate:)), class_getInstanceMethod(self, @selector(setOneSignalReactNativeDelegate:)));
44+
});
45+
}
46+
47+
48+
- (void) setOneSignalReactNativeDelegate:(id<UIApplicationDelegate>)delegate {
49+
static dispatch_once_t onceToken;
50+
dispatch_once(&onceToken, ^{
51+
Class delegateClass = [delegate class];
52+
53+
injectSelector(self.class, @selector(oneSignalApplication:didFinishLaunchingWithOptions:),
54+
delegateClass, @selector(application:didFinishLaunchingWithOptions:));
55+
[self setOneSignalReactNativeDelegate:delegate];
56+
});
57+
}
58+
59+
- (BOOL)oneSignalApplication:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
60+
[RCTOneSignal.sharedInstance initOneSignal];
61+
62+
if ([self respondsToSelector:@selector(oneSignalApplication:didFinishLaunchingWithOptions:)])
63+
return [self oneSignalApplication:application didFinishLaunchingWithOptions:launchOptions];
64+
return YES;
65+
}
66+
67+
@end

0 commit comments

Comments
 (0)