1919#import < React/RCTViewManager.h>
2020#import < React/RCTUIManager.h>
2121#import < React/RCTBridge.h>
22+ #import < os/log.h>
2223#import " RoktEventManager.h"
2324
2425#ifdef RCT_NEW_ARCH_ENABLED
2526#import " RoktNativeLayoutComponentView.h"
2627#import < RNMParticle/RNMParticle.h>
2728#endif // RCT_NEW_ARCH_ENABLED
2829
30+ // os_log for [mParticle-Rokt] diagnostics: visible in production (Console.app, device logs)
31+ // and does not trigger RCT LogBox/warning UI in debug.
32+ static os_log_t _rokt_os_log (void ) {
33+ static os_log_t log;
34+ static dispatch_once_t once;
35+ dispatch_once (&once, ^{
36+ log = os_log_create (" com.mparticle.react-native" , " rokt" );
37+ });
38+ return log;
39+ }
40+
41+ static void _rokt_log (NSString *format, ...) {
42+ va_list args;
43+ va_start (args, format);
44+ NSString *msg = [[NSString alloc ] initWithFormat: format arguments: args];
45+ va_end (args);
46+ os_log_with_type (_rokt_os_log (), OS_LOG_TYPE_INFO, " %{public}s" , [msg UTF8String ]);
47+ }
48+
2949@interface RNMPRokt ()
3050
3151@property (nonatomic , nullable ) RoktEventManager *eventManager;
@@ -43,11 +63,15 @@ + (NSString *)moduleName {
4363}
4464
4565+ (void )load {
66+ _rokt_log (@" [mParticle-Rokt] RNMPRokt module load" );
4667 RCTRegisterModule (self);
4768}
4869
4970- (dispatch_queue_t )methodQueue
5071{
72+ BOOL bridgeNil = (self.bridge == nil );
73+ BOOL uiManagerNil = (self.bridge .uiManager == nil );
74+ _rokt_log (@" [mParticle-Rokt] methodQueue called, bridge %@ , uiManager %@ " , bridgeNil ? @" nil" : @" non-nil" , uiManagerNil ? @" nil" : @" non-nil" );
5175 return self.bridge .uiManager .methodQueue ;
5276}
5377
@@ -65,8 +89,10 @@ - (void)setMethodQueue:(dispatch_queue_t)methodQueue
6589static NSDictionary * __attribute__ ((optnone)) safeExtractRoktConfigDict(
6690 JS::NativeMPRokt::RoktConfigType &roktConfig) {
6791 if (&roktConfig == nullptr ) {
92+ _rokt_log (@" [mParticle-Rokt] safeExtractRoktConfigDict: roktConfig ref is nullptr, returning nil" );
6893 return nil ;
6994 }
95+ _rokt_log (@" [mParticle-Rokt] safeExtractRoktConfigDict: extracting config" );
7096 NSMutableDictionary *roktConfigDict = [[NSMutableDictionary alloc ] init ];
7197 if (roktConfig.cacheConfig ().has_value ()) {
7298 NSMutableDictionary *cacheConfigDict = [[NSMutableDictionary alloc ] init ];
@@ -78,7 +104,11 @@ - (void)setMethodQueue:(dispatch_queue_t)methodQueue
78104 cacheConfigDict[@" cacheAttributes" ] = cacheConfig.cacheAttributes ();
79105 }
80106 roktConfigDict[@" cacheConfig" ] = cacheConfigDict;
107+ _rokt_log (@" [mParticle-Rokt] safeExtractRoktConfigDict: cacheConfig present, keys: %lu " , (unsigned long )roktConfigDict.count );
108+ } else {
109+ _rokt_log (@" [mParticle-Rokt] safeExtractRoktConfigDict: cacheConfig has no value" );
81110 }
111+ _rokt_log (@" [mParticle-Rokt] safeExtractRoktConfigDict: returning dict with %lu keys" , (unsigned long )roktConfigDict.count );
82112 return roktConfigDict;
83113}
84114
@@ -89,6 +119,7 @@ - (void)selectPlacements:(NSString *)identifer
89119 roktConfig : (JS::NativeMPRokt::RoktConfigType &)roktConfig
90120 fontFilesMap : (NSDictionary *)fontFilesMap
91121{
122+ _rokt_log (@" [mParticle-Rokt] New Architecture Implementation" );
92123 NSMutableDictionary *finalAttributes = [self convertToMutableDictionaryOfStrings: attributes];
93124
94125 NSDictionary *roktConfigDict = safeExtractRoktConfigDict (roktConfig);
@@ -97,51 +128,73 @@ - (void)selectPlacements:(NSString *)identifer
97128// Old Architecture Implementation
98129RCT_EXPORT_METHOD (selectPlacements:(NSString *) identifer attributes:(NSDictionary *)attributes placeholders:(NSDictionary * _Nullable)placeholders roktConfig:(NSDictionary * _Nullable)roktConfig fontFilesMap:(NSDictionary * _Nullable)fontFilesMap)
99130{
131+ _rokt_log (@" [mParticle-Rokt] Old Architecture Implementation" );
100132 NSMutableDictionary *finalAttributes = [self convertToMutableDictionaryOfStrings: attributes];
101133 MPRoktConfig *config = [self buildRoktConfigFromDict: roktConfig];
102134#endif
103135
136+ _rokt_log (@" [mParticle-Rokt] selectPlacements called with identifier: %@ , attributes count: %lu " , identifer, (unsigned long )finalAttributes.count );
137+
104138 [MParticle _setWrapperSdk_internal: MPWrapperSdkReactNative version: @" " ];
105139 // Create callback implementation
106140 MPRoktEventCallback *callbacks = [[MPRoktEventCallback alloc ] init ];
107-
108141 __weak __typeof__ (self) weakSelf = self;
109142
110143 callbacks.onLoad = ^{
111- [self .eventManager onRoktCallbackReceived: @" onLoad" ];
144+ _rokt_log (@" [mParticle-Rokt] onLoad" );
145+ [weakSelf.eventManager onRoktCallbackReceived: @" onLoad" ];
112146 };
113147
114148 callbacks.onUnLoad = ^{
115- [ self .eventManager onRoktCallbackReceived: @" onUnLoad" ] ;
116- RCTLogInfo ( @" unloaded " ) ;
149+ _rokt_log ( @" [mParticle-Rokt] onUnLoad" ) ;
150+ [weakSelf.eventManager onRoktCallbackReceived: @" onUnLoad " ] ;
117151 };
118152
119153 callbacks.onShouldShowLoadingIndicator = ^{
120- [self .eventManager onRoktCallbackReceived: @" onShouldShowLoadingIndicator" ];
154+ _rokt_log (@" [mParticle-Rokt] onShouldShowLoadingIndicator" );
155+ [weakSelf.eventManager onRoktCallbackReceived: @" onShouldShowLoadingIndicator" ];
121156 };
122157
123158 callbacks.onShouldHideLoadingIndicator = ^{
124- [self .eventManager onRoktCallbackReceived: @" onShouldHideLoadingIndicator" ];
159+ _rokt_log (@" [mParticle-Rokt] onShouldHideLoadingIndicator" );
160+ [weakSelf.eventManager onRoktCallbackReceived: @" onShouldHideLoadingIndicator" ];
125161 };
126162
127163 callbacks.onEmbeddedSizeChange = ^(NSString *placementId, CGFloat height) {
128- [self .eventManager onWidgetHeightChanges: height placement: placementId];
164+ _rokt_log (@" [mParticle-Rokt] onEmbeddedSizeChange" );
165+ [weakSelf.eventManager onWidgetHeightChanges: height placement: placementId];
129166 };
130167
131- if (self.bridge == nil || self.bridge .uiManager == nil ) {
132- NSLog (@" [mParticle-Rokt] addUIBlock skipped: self.bridge%@ is nil. selectPlacements will not be called. This can occur in New Architecture bridgeless production builds." , self.bridge == nil ? @" " : @" .uiManager" );
168+ BOOL bridgeNil = (self.bridge == nil );
169+ BOOL uiManagerNil = (self.bridge .uiManager == nil );
170+ _rokt_log (@" [mParticle-Rokt] bridge %@ , uiManager %@ " , bridgeNil ? @" nil" : @" non-nil" , uiManagerNil ? @" nil" : @" non-nil" );
171+
172+ if (bridgeNil || uiManagerNil) {
173+ _rokt_log (@" [mParticle-Rokt] addUIBlock skipped: self.bridge%@ is nil. selectPlacements will not be called. This can occur in New Architecture bridgeless production builds." , bridgeNil ? @" " : @" .uiManager" );
174+ } else {
175+ _rokt_log (@" [mParticle-Rokt] queuing addUIBlock for identifier: %@ " , identifer);
133176 }
134177 [self .bridge.uiManager addUIBlock: ^(RCTUIManager *uiManager, NSDictionary <NSNumber *,UIView *> *viewRegistry) {
135- NSMutableDictionary *nativePlaceholders = [self getNativePlaceholders: placeholders viewRegistry: viewRegistry];
178+ __strong __typeof__ (weakSelf) strongSelf = weakSelf;
179+ _rokt_log (@" [mParticle-Rokt] addUIBlock executing for identifier: %@ , viewRegistry count: %lu " , identifer, (unsigned long )viewRegistry.count );
136180
137- [self subscribeViewEvents: identifer];
181+ NSMutableDictionary *nativePlaceholders = strongSelf ? [strongSelf getNativePlaceholders: placeholders viewRegistry: viewRegistry] : [NSMutableDictionary dictionary ];
182+
183+ if (strongSelf) {
184+ [strongSelf subscribeViewEvents: identifer];
185+ }
138186
187+ id mpInstance = [MParticle sharedInstance ];
188+ id roktKit = mpInstance ? [mpInstance rokt ] : nil ;
189+ _rokt_log (@" [mParticle-Rokt] MParticle sharedInstance %@ , rokt kit %@ " , mpInstance ? @" non-nil" : @" nil" , roktKit ? @" non-nil" : @" nil" );
190+ _rokt_log (@" [mParticle-Rokt] calling mParticle Core selectPlacements for: %@ " , identifer);
139191 [[[MParticle sharedInstance ] rokt ] selectPlacements: identifer
140192 attributes: finalAttributes
141193 embeddedViews: nativePlaceholders
142194 config: config
143195 callbacks: callbacks];
144196 }];
197+ _rokt_log (@" [mParticle-Rokt] addUIBlock enqueued for identifier: %@ " , identifer);
145198}
146199
147200RCT_EXPORT_METHOD (purchaseFinalized : (NSString *)placementId catalogItemId : (
@@ -180,6 +233,7 @@ - (MPColorMode)stringToColorMode:(NSString*)colorString
180233}
181234
182235- (MPRoktConfig *)buildRoktConfigFromDict:(NSDictionary <NSString *, id > *)configMap {
236+ _rokt_log (@" [mParticle-Rokt] buildRoktConfigFromDict: configMap %@ " , configMap == nil ? @" nil" : [NSString stringWithFormat: @" non-nil (%lu keys)" , (unsigned long )configMap.count]);
183237 MPRoktConfig *config = [[MPRoktConfig alloc ] init ];
184238 BOOL isConfigEmpty = YES ;
185239
@@ -212,11 +266,13 @@ - (MPRoktConfig *)buildRoktConfigFromDict:(NSDictionary<NSString *, id> *)config
212266 config.cacheDuration = cacheDuration;
213267 }
214268
269+ _rokt_log (@" [mParticle-Rokt] buildRoktConfigFromDict: returning %@ " , isConfigEmpty ? @" nil" : @" config" );
215270 return isConfigEmpty ? nil : config;
216271}
217272
218273- (void )subscribeViewEvents:(NSString * _Nonnull) viewName
219274{
275+ _rokt_log (@" [mParticle-Rokt] subscribeViewEvents for viewName: %@ " , viewName);
220276 if (self.eventManager == nil ) {
221277 self.eventManager = [RoktEventManager allocWithZone: nil ];
222278 }
@@ -227,6 +283,7 @@ - (void)subscribeViewEvents:(NSString* _Nonnull) viewName
227283
228284- (NSMutableDictionary *)getNativePlaceholders:(NSDictionary *)placeholders viewRegistry:(NSDictionary <NSNumber *, UIView *> *)viewRegistry
229285{
286+ _rokt_log (@" [mParticle-Rokt] getNativePlaceholders: placeholders %lu , viewRegistry %lu " , (unsigned long )placeholders.count , (unsigned long )viewRegistry.count );
230287 NSMutableDictionary *nativePlaceholders = [[NSMutableDictionary alloc ]initWithCapacity:placeholders.count];
231288
232289 for (id key in placeholders){
@@ -248,12 +305,14 @@ - (NSMutableDictionary *)getNativePlaceholders:(NSDictionary *)placeholders view
248305#endif // RCT_NEW_ARCH_ENABLED
249306 }
250307
308+ _rokt_log (@" [mParticle-Rokt] getNativePlaceholders: resolved %lu native placeholder(s)" , (unsigned long )nativePlaceholders.count );
251309 return nativePlaceholders;
252310}
253311
254312#ifdef RCT_NEW_ARCH_ENABLED
255313- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const facebook::react::ObjCTurboModule::InitParams &)params {
256314 self.bridge = params.instance .bridge ;
315+ _rokt_log (@" [mParticle-Rokt] getTurboModule: bridge set to %@ " , self.bridge == nil ? @" nil" : @" non-nil" );
257316 return std::make_shared<facebook::react::NativeMPRoktSpecJSI>(params);
258317}
259318#endif // RCT_NEW_ARCH_ENABLED
0 commit comments