11#import " RNBranch.h"
2- #import < React/RCTBridge.h>
32#import < React/RCTEventDispatcher.h>
43#import < React/RCTLog.h>
54#import " BranchEvent+RNBranch.h"
1817
1918static NSDictionary *initSessionWithLaunchOptionsResult;
2019static BOOL useTestInstance = NO ;
20+ static NSDictionary *savedLaunchOptions;
21+ static BOOL savedIsReferrable;
22+ static NSString *branchKey;
23+ static BOOL deferInitializationForJSLoad = NO ;
2124
2225static NSString * const IdentFieldName = @" ident" ;
2326
2427// These are only really exposed to the JS layer, so keep them internal for now.
2528static NSString * const RNBranchErrorDomain = @" RNBranchErrorDomain" ;
2629static NSInteger const RNBranchUniversalObjectNotFoundError = 1 ;
2730
28-
2931#pragma mark - Private RNBranch declarations
3032
3133@interface RNBranch ()
@@ -37,8 +39,6 @@ @interface RNBranch()
3739
3840@implementation RNBranch
3941
40- @synthesize bridge = _bridge;
41-
4242RCT_EXPORT_MODULE ();
4343
4444+ (Branch *)branch
@@ -51,7 +51,7 @@ + (Branch *)branch
5151
5252 // YES if either [RNBranch useTestInstance] was called or useTestInstance: true is present in branch.json.
5353 BOOL usingTestInstance = useTestInstance || config.useTestInstance ;
54- NSString *key = config.branchKey ?: usingTestInstance ? config.testKey : config.liveKey ;
54+ NSString *key = branchKey ?: config.branchKey ?: usingTestInstance ? config.testKey : config.liveKey ;
5555
5656 if (key) {
5757 // Override the Info.plist if these are present.
@@ -153,23 +153,36 @@ + (void)setRequestMetadataKey:(NSString *)key value:(NSObject *)value
153153+ (void )useTestInstance {
154154 useTestInstance = YES ;
155155}
156+
157+ + (void )deferInitializationForJSLoad
158+ {
159+ deferInitializationForJSLoad = YES ;
160+ }
156161
157162// Called by AppDelegate.m -- stores initSession result in static variables and posts RNBranchLinkOpened event that's captured by the RNBranch instance to emit it to React Native
158163+ (void )initSessionWithLaunchOptions : (NSDictionary *)launchOptions isReferrable : (BOOL )isReferrable {
159- [self .branch initSessionWithLaunchOptions: launchOptions isReferrable: isReferrable andRegisterDeepLinkHandler: ^(NSDictionary *params, NSError *error) {
164+ savedLaunchOptions = launchOptions;
165+ savedIsReferrable = isReferrable;
166+
167+ if (!deferInitializationForJSLoad && !RNBranchConfig.instance .deferInitializationForJSLoad ) [self initializeBranchSDK ];
168+ }
169+
170+ + (void )initializeBranchSDK
171+ {
172+ [self .branch initSessionWithLaunchOptions: savedLaunchOptions isReferrable: savedIsReferrable andRegisterDeepLinkHandler: ^(NSDictionary *params, NSError *error) {
160173 NSMutableDictionary *result = [NSMutableDictionary dictionary ];
161174 if (error) result[RNBranchLinkOpenedNotificationErrorKey] = error;
162175 if (params) {
163176 result[RNBranchLinkOpenedNotificationParamsKey] = params;
164177 BOOL clickedBranchLink = params[@" +clicked_branch_link" ];
165-
178+
166179 if (clickedBranchLink) {
167180 BranchUniversalObject *branchUniversalObject = [BranchUniversalObject objectWithDictionary: params];
168181 if (branchUniversalObject) result[RNBranchLinkOpenedNotificationBranchUniversalObjectKey] = branchUniversalObject;
169-
182+
170183 BranchLinkProperties *linkProperties = [BranchLinkProperties getBranchLinkPropertiesFromDictionary: params];
171184 if (linkProperties) result[RNBranchLinkOpenedNotificationLinkPropertiesKey] = linkProperties;
172-
185+
173186 if (params[@" ~referring_link" ]) {
174187 result[RNBranchLinkOpenedNotificationUriKey] = [NSURL URLWithString: params[@" ~referring_link" ]];
175188 }
@@ -178,7 +191,7 @@ + (void)initSessionWithLaunchOptions:(NSDictionary *)launchOptions isReferrable:
178191 result[RNBranchLinkOpenedNotificationUriKey] = [NSURL URLWithString: params[@" +non_branch_link" ]];
179192 }
180193 }
181-
194+
182195 [[NSNotificationCenter defaultCenter ] postNotificationName: RNBranchLinkOpenedNotification object: nil userInfo: result];
183196 }];
184197}
@@ -291,6 +304,24 @@ - (BranchUniversalObject *)findUniversalObjectWithIdent:(NSString *)ident reject
291304 resolve ([Branch trackingDisabled ] ? @YES : @NO );
292305}
293306
307+ #pragma mark initializeBranch
308+ RCT_EXPORT_METHOD (initializeBranch:(NSString *)key
309+ resolver:(RCTPromiseResolveBlock)resolve
310+ rejecter:(__unused RCTPromiseRejectBlock)reject
311+ ) {
312+ if (!deferInitializationForJSLoad && !RNBranchConfig.instance .deferInitializationForJSLoad ) {
313+ // This is a no-op from JS unless [RNBranch deferInitializationForJSLoad] is called.
314+ resolve (0 );
315+ return ;
316+ }
317+
318+ RCTLogTrace (@" Initializing Branch SDK. Key from JS: %@ " , key);
319+ branchKey = key;
320+
321+ [self .class initializeBranchSDK ];
322+ resolve (0 );
323+ }
324+
294325#pragma mark redeemInitSessionResult
295326RCT_EXPORT_METHOD (
296327 redeemInitSessionResult:(RCTPromiseResolveBlock)resolve
0 commit comments