1// 2// RNBranchEventEmitter.m 3// Pods 4// 5// Created by Jimmy Dee on 4/6/17. 6// 7// 8 9#import <React/RCTLog.h> 10 11#import "RNBranch.h" 12#import "RNBranchEventEmitter.h" 13 14// Notification/Event Names 15NSString * const kRNBranchInitSessionStart = @"RNBranch.initSessionStart"; 16NSString * const kRNBranchInitSessionSuccess = @"RNBranch.initSessionSuccess"; 17NSString * const kRNBranchInitSessionError = @"RNBranch.initSessionError"; 18 19@interface RNBranchEventEmitter() 20@property (nonatomic) BOOL hasListeners; 21@end 22 23@implementation RNBranchEventEmitter 24 25RCT_EXPORT_MODULE(); 26 27- (instancetype)init 28{ 29 self = [super init]; 30 if (self) { 31 _hasListeners = NO; 32 } 33 return self; 34} 35 36+ (BOOL)requiresMainQueueSetup { 37 return YES; 38} 39 40- (NSArray<NSString *> *)supportedEvents { 41 return @[ 42 kRNBranchInitSessionStart, 43 kRNBranchInitSessionSuccess, 44 kRNBranchInitSessionError 45 ]; 46} 47 48- (void)startObserving { 49 self.hasListeners = YES; 50 for (NSString *event in [self supportedEvents]) { 51 [[NSNotificationCenter defaultCenter] addObserver:self 52 selector:@selector(handleNotification:) 53 name:event 54 object:nil]; 55 } 56} 57 58- (void)stopObserving { 59 [[NSNotificationCenter defaultCenter] removeObserver:self]; 60 self.hasListeners = NO; 61} 62 63# pragma mark - Public 64 65+ (void)initSessionWillStartWithURI:(NSURL *)uri 66{ 67 /* 68 * Transmits an Object to JS with a member named uri. This member 69 * will be null if the uri argument here is nil (e.g. Spotlight item). 70 * 71 * branch.subscribe({ 72 * onOpenStart: ({ uri }) => { 73 * console.log('Opening URI ' + uri) 74 * }, 75 * }) 76 * 77 * Note that deferred deep link checks will not trigger an onOpenStart call in JS 78 * (RNBranch.INIT_SESSION_START). 79 */ 80 [self postNotificationName:kRNBranchInitSessionStart withPayload:@{ 81 RNBranchLinkOpenedNotificationUriKey: uri.absoluteString ?: NSNull.null 82 }]; 83} 84 85+ (void)initSessionDidSucceedWithPayload:(NSDictionary *)payload 86{ 87 [self postNotificationName:kRNBranchInitSessionSuccess withPayload:payload]; 88} 89 90+ (void)initSessionDidEncounterErrorWithPayload:(NSDictionary *)payload 91{ 92 [self postNotificationName:kRNBranchInitSessionError withPayload:payload]; 93} 94 95# pragma mark - Private 96 97+ (void)postNotificationName:(NSString *)name withPayload:(NSDictionary<NSString *, id> *)payload { 98 [[NSNotificationCenter defaultCenter] postNotificationName:name 99 object:self 100 userInfo:payload]; 101} 102 103- (void)handleNotification:(NSNotification *)notification { 104 if (!self.hasListeners) return; 105 [self sendEventWithName:notification.name body:notification.userInfo]; 106} 107 108@end 109