From 8a62c7397866dd164d97020fc349f86382ca8315 Mon Sep 17 00:00:00 2001 From: Brandon Stalnaker Date: Fri, 13 Mar 2026 14:34:58 -0400 Subject: [PATCH 1/3] chore: Add Additonal Diagnostic Logs --- ios/RNMParticle/RNMPRokt.mm | 58 ++++++++++++++++++++++++++++++------- 1 file changed, 47 insertions(+), 11 deletions(-) diff --git a/ios/RNMParticle/RNMPRokt.mm b/ios/RNMParticle/RNMPRokt.mm index fbae339..9f8b215 100644 --- a/ios/RNMParticle/RNMPRokt.mm +++ b/ios/RNMParticle/RNMPRokt.mm @@ -43,11 +43,15 @@ + (NSString *)moduleName { } + (void)load { + RCTLogWarn(@"[mParticle-Rokt] RNMPRokt module load"); RCTRegisterModule(self); } - (dispatch_queue_t)methodQueue { + BOOL bridgeNil = (self.bridge == nil); + BOOL uiManagerNil = (self.bridge.uiManager == nil); + RCTLogWarn(@"[mParticle-Rokt] methodQueue called, bridge %@, uiManager %@", bridgeNil ? @"nil" : @"non-nil", uiManagerNil ? @"nil" : @"non-nil"); return self.bridge.uiManager.methodQueue; } @@ -65,8 +69,10 @@ - (void)setMethodQueue:(dispatch_queue_t)methodQueue static NSDictionary * __attribute__((optnone)) safeExtractRoktConfigDict( JS::NativeMPRokt::RoktConfigType &roktConfig) { if (&roktConfig == nullptr) { + RCTLogWarn(@"[mParticle-Rokt] safeExtractRoktConfigDict: roktConfig ref is nullptr, returning nil"); return nil; } + RCTLogWarn(@"[mParticle-Rokt] safeExtractRoktConfigDict: extracting config"); NSMutableDictionary *roktConfigDict = [[NSMutableDictionary alloc] init]; if (roktConfig.cacheConfig().has_value()) { NSMutableDictionary *cacheConfigDict = [[NSMutableDictionary alloc] init]; @@ -78,7 +84,11 @@ - (void)setMethodQueue:(dispatch_queue_t)methodQueue cacheConfigDict[@"cacheAttributes"] = cacheConfig.cacheAttributes(); } roktConfigDict[@"cacheConfig"] = cacheConfigDict; + RCTLogWarn(@"[mParticle-Rokt] safeExtractRoktConfigDict: cacheConfig present, keys: %lu", (unsigned long)roktConfigDict.count); + } else { + RCTLogWarn(@"[mParticle-Rokt] safeExtractRoktConfigDict: cacheConfig has no value"); } + RCTLogWarn(@"[mParticle-Rokt] safeExtractRoktConfigDict: returning dict with %lu keys", (unsigned long)roktConfigDict.count); return roktConfigDict; } @@ -89,6 +99,7 @@ - (void)selectPlacements:(NSString *)identifer roktConfig:(JS::NativeMPRokt::RoktConfigType &)roktConfig fontFilesMap:(NSDictionary *)fontFilesMap { + RCTLogWarn(@"[mParticle-Rokt] New Architecture Implementation"); NSMutableDictionary *finalAttributes = [self convertToMutableDictionaryOfStrings:attributes]; NSDictionary *roktConfigDict = safeExtractRoktConfigDict(roktConfig); @@ -97,51 +108,70 @@ - (void)selectPlacements:(NSString *)identifer // Old Architecture Implementation RCT_EXPORT_METHOD(selectPlacements:(NSString *) identifer attributes:(NSDictionary *)attributes placeholders:(NSDictionary * _Nullable)placeholders roktConfig:(NSDictionary * _Nullable)roktConfig fontFilesMap:(NSDictionary * _Nullable)fontFilesMap) { + RCTLogWarn(@"[mParticle-Rokt] Old Architecture Implementation"); NSMutableDictionary *finalAttributes = [self convertToMutableDictionaryOfStrings:attributes]; MPRoktConfig *config = [self buildRoktConfigFromDict:roktConfig]; #endif + RCTLogWarn(@"[mParticle-Rokt] selectPlacements called with identifier: %@, attributes count: %lu", identifer, (unsigned long)finalAttributes.count); + [MParticle _setWrapperSdk_internal:MPWrapperSdkReactNative version:@""]; // Create callback implementation MPRoktEventCallback *callbacks = [[MPRoktEventCallback alloc] init]; - __weak __typeof__(self) weakSelf = self; callbacks.onLoad = ^{ - [self.eventManager onRoktCallbackReceived:@"onLoad"]; + RCTLogWarn(@"[mParticle-Rokt] onLoad"); + [weakSelf.eventManager onRoktCallbackReceived:@"onLoad"]; }; callbacks.onUnLoad = ^{ - [self.eventManager onRoktCallbackReceived:@"onUnLoad"]; - RCTLogInfo(@"unloaded"); + RCTLogWarn(@"[mParticle-Rokt] onUnLoad"); + [weakSelf.eventManager onRoktCallbackReceived:@"onUnLoad"]; }; callbacks.onShouldShowLoadingIndicator = ^{ - [self.eventManager onRoktCallbackReceived:@"onShouldShowLoadingIndicator"]; + RCTLogWarn(@"[mParticle-Rokt] onShouldShowLoadingIndicator"); + [weakSelf.eventManager onRoktCallbackReceived:@"onShouldShowLoadingIndicator"]; }; callbacks.onShouldHideLoadingIndicator = ^{ - [self.eventManager onRoktCallbackReceived:@"onShouldHideLoadingIndicator"]; + RCTLogWarn(@"[mParticle-Rokt] onShouldHideLoadingIndicator"); + [weakSelf.eventManager onRoktCallbackReceived:@"onShouldHideLoadingIndicator"]; }; callbacks.onEmbeddedSizeChange = ^(NSString *placementId, CGFloat height) { - [self.eventManager onWidgetHeightChanges:height placement:placementId]; + RCTLogWarn(@"[mParticle-Rokt] onEmbeddedSizeChange"); + [weakSelf.eventManager onWidgetHeightChanges:height placement:placementId]; }; - if (self.bridge == nil || self.bridge.uiManager == nil) { - 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"); + BOOL bridgeNil = (self.bridge == nil); + BOOL uiManagerNil = (self.bridge.uiManager == nil); + RCTLogWarn(@"[mParticle-Rokt] bridge %@, uiManager %@", bridgeNil ? @"nil" : @"non-nil", uiManagerNil ? @"nil" : @"non-nil"); + + if (bridgeNil || uiManagerNil) { + RCTLogWarn(@"[mParticle-Rokt] addUIBlock skipped: self.bridge%@ is nil. selectPlacements will not be called. This can occur in New Architecture bridgeless production builds.", bridgeNil ? @"" : @".uiManager"); + } else { + RCTLogWarn(@"[mParticle-Rokt] queuing addUIBlock for identifier: %@", identifer); } [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary *viewRegistry) { - NSMutableDictionary *nativePlaceholders = [self getNativePlaceholders:placeholders viewRegistry:viewRegistry]; + __strong __typeof__(weakSelf) strongSelf = weakSelf; + RCTLogWarn(@"[mParticle-Rokt] addUIBlock executing for identifier: %@, viewRegistry count: %lu", identifer, (unsigned long)viewRegistry.count); - [self subscribeViewEvents:identifer]; + NSMutableDictionary *nativePlaceholders = strongSelf ? [strongSelf getNativePlaceholders:placeholders viewRegistry:viewRegistry] : [NSMutableDictionary dictionary]; + + if (strongSelf) { + [strongSelf subscribeViewEvents:identifer]; + } + RCTLogWarn(@"[mParticle-Rokt] calling mParticle Core selectPlacements for: %@", identifer); [[[MParticle sharedInstance] rokt] selectPlacements:identifer attributes:finalAttributes embeddedViews:nativePlaceholders config:config callbacks:callbacks]; }]; + RCTLogWarn(@"[mParticle-Rokt] addUIBlock enqueued for identifier: %@", identifer); } RCT_EXPORT_METHOD(purchaseFinalized : (NSString *)placementId catalogItemId : ( @@ -180,6 +210,7 @@ - (MPColorMode)stringToColorMode:(NSString*)colorString } - (MPRoktConfig *)buildRoktConfigFromDict:(NSDictionary *)configMap { + RCTLogWarn(@"[mParticle-Rokt] buildRoktConfigFromDict: configMap %@", configMap == nil ? @"nil" : [NSString stringWithFormat:@"non-nil (%lu keys)", (unsigned long)configMap.count]); MPRoktConfig *config = [[MPRoktConfig alloc] init]; BOOL isConfigEmpty = YES; @@ -212,11 +243,13 @@ - (MPRoktConfig *)buildRoktConfigFromDict:(NSDictionary *)config config.cacheDuration = cacheDuration; } + RCTLogWarn(@"[mParticle-Rokt] buildRoktConfigFromDict: returning %@", isConfigEmpty ? @"nil" : @"config"); return isConfigEmpty ? nil : config; } - (void)subscribeViewEvents:(NSString* _Nonnull) viewName { + RCTLogWarn(@"[mParticle-Rokt] subscribeViewEvents for viewName: %@", viewName); if (self.eventManager == nil) { self.eventManager = [RoktEventManager allocWithZone: nil]; } @@ -227,6 +260,7 @@ - (void)subscribeViewEvents:(NSString* _Nonnull) viewName - (NSMutableDictionary *)getNativePlaceholders:(NSDictionary *)placeholders viewRegistry:(NSDictionary *)viewRegistry { + RCTLogWarn(@"[mParticle-Rokt] getNativePlaceholders: placeholders %lu, viewRegistry %lu", (unsigned long)placeholders.count, (unsigned long)viewRegistry.count); NSMutableDictionary *nativePlaceholders = [[NSMutableDictionary alloc]initWithCapacity:placeholders.count]; for(id key in placeholders){ @@ -248,12 +282,14 @@ - (NSMutableDictionary *)getNativePlaceholders:(NSDictionary *)placeholders view #endif // RCT_NEW_ARCH_ENABLED } + RCTLogWarn(@"[mParticle-Rokt] getNativePlaceholders: resolved %lu native placeholder(s)", (unsigned long)nativePlaceholders.count); return nativePlaceholders; } #ifdef RCT_NEW_ARCH_ENABLED - (std::shared_ptr)getTurboModule:(const facebook::react::ObjCTurboModule::InitParams &)params { self.bridge = params.instance.bridge; + RCTLogWarn(@"[mParticle-Rokt] getTurboModule: bridge set to %@", self.bridge == nil ? @"nil" : @"non-nil"); return std::make_shared(params); } #endif // RCT_NEW_ARCH_ENABLED From 73abbf3262d9a2651d4a95fe0d519422e862abda Mon Sep 17 00:00:00 2001 From: Brandon Stalnaker Date: Fri, 13 Mar 2026 16:13:12 -0400 Subject: [PATCH 2/3] switch to os_log --- ios/RNMParticle/RNMPRokt.mm | 74 +++++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 27 deletions(-) diff --git a/ios/RNMParticle/RNMPRokt.mm b/ios/RNMParticle/RNMPRokt.mm index 9f8b215..760a732 100644 --- a/ios/RNMParticle/RNMPRokt.mm +++ b/ios/RNMParticle/RNMPRokt.mm @@ -19,6 +19,7 @@ #import #import #import +#import #import "RoktEventManager.h" #ifdef RCT_NEW_ARCH_ENABLED @@ -26,6 +27,25 @@ #import #endif // RCT_NEW_ARCH_ENABLED +// os_log for [mParticle-Rokt] diagnostics: visible in production (Console.app, device logs) +// and does not trigger RCT LogBox/warning UI in debug. +static os_log_t _rokt_os_log(void) { + static os_log_t log; + static dispatch_once_t once; + dispatch_once(&once, ^{ + log = os_log_create("com.mparticle.react-native", "rokt"); + }); + return log; +} + +static void _rokt_log(NSString *format, ...) { + va_list args; + va_start(args, format); + NSString *msg = [[NSString alloc] initWithFormat:format arguments:args]; + va_end(args); + os_log_with_type(_rokt_os_log(), OS_LOG_TYPE_INFO, "%{public}s", [msg UTF8String]); +} + @interface RNMPRokt () @property (nonatomic, nullable) RoktEventManager *eventManager; @@ -43,7 +63,7 @@ + (NSString *)moduleName { } + (void)load { - RCTLogWarn(@"[mParticle-Rokt] RNMPRokt module load"); + _rokt_log(@"[mParticle-Rokt] RNMPRokt module load"); RCTRegisterModule(self); } @@ -51,7 +71,7 @@ - (dispatch_queue_t)methodQueue { BOOL bridgeNil = (self.bridge == nil); BOOL uiManagerNil = (self.bridge.uiManager == nil); - RCTLogWarn(@"[mParticle-Rokt] methodQueue called, bridge %@, uiManager %@", bridgeNil ? @"nil" : @"non-nil", uiManagerNil ? @"nil" : @"non-nil"); + _rokt_log(@"[mParticle-Rokt] methodQueue called, bridge %@, uiManager %@", bridgeNil ? @"nil" : @"non-nil", uiManagerNil ? @"nil" : @"non-nil"); return self.bridge.uiManager.methodQueue; } @@ -69,10 +89,10 @@ - (void)setMethodQueue:(dispatch_queue_t)methodQueue static NSDictionary * __attribute__((optnone)) safeExtractRoktConfigDict( JS::NativeMPRokt::RoktConfigType &roktConfig) { if (&roktConfig == nullptr) { - RCTLogWarn(@"[mParticle-Rokt] safeExtractRoktConfigDict: roktConfig ref is nullptr, returning nil"); + _rokt_log(@"[mParticle-Rokt] safeExtractRoktConfigDict: roktConfig ref is nullptr, returning nil"); return nil; } - RCTLogWarn(@"[mParticle-Rokt] safeExtractRoktConfigDict: extracting config"); + _rokt_log(@"[mParticle-Rokt] safeExtractRoktConfigDict: extracting config"); NSMutableDictionary *roktConfigDict = [[NSMutableDictionary alloc] init]; if (roktConfig.cacheConfig().has_value()) { NSMutableDictionary *cacheConfigDict = [[NSMutableDictionary alloc] init]; @@ -84,11 +104,11 @@ - (void)setMethodQueue:(dispatch_queue_t)methodQueue cacheConfigDict[@"cacheAttributes"] = cacheConfig.cacheAttributes(); } roktConfigDict[@"cacheConfig"] = cacheConfigDict; - RCTLogWarn(@"[mParticle-Rokt] safeExtractRoktConfigDict: cacheConfig present, keys: %lu", (unsigned long)roktConfigDict.count); + _rokt_log(@"[mParticle-Rokt] safeExtractRoktConfigDict: cacheConfig present, keys: %lu", (unsigned long)roktConfigDict.count); } else { - RCTLogWarn(@"[mParticle-Rokt] safeExtractRoktConfigDict: cacheConfig has no value"); + _rokt_log(@"[mParticle-Rokt] safeExtractRoktConfigDict: cacheConfig has no value"); } - RCTLogWarn(@"[mParticle-Rokt] safeExtractRoktConfigDict: returning dict with %lu keys", (unsigned long)roktConfigDict.count); + _rokt_log(@"[mParticle-Rokt] safeExtractRoktConfigDict: returning dict with %lu keys", (unsigned long)roktConfigDict.count); return roktConfigDict; } @@ -99,7 +119,7 @@ - (void)selectPlacements:(NSString *)identifer roktConfig:(JS::NativeMPRokt::RoktConfigType &)roktConfig fontFilesMap:(NSDictionary *)fontFilesMap { - RCTLogWarn(@"[mParticle-Rokt] New Architecture Implementation"); + _rokt_log(@"[mParticle-Rokt] New Architecture Implementation"); NSMutableDictionary *finalAttributes = [self convertToMutableDictionaryOfStrings:attributes]; NSDictionary *roktConfigDict = safeExtractRoktConfigDict(roktConfig); @@ -108,12 +128,12 @@ - (void)selectPlacements:(NSString *)identifer // Old Architecture Implementation RCT_EXPORT_METHOD(selectPlacements:(NSString *) identifer attributes:(NSDictionary *)attributes placeholders:(NSDictionary * _Nullable)placeholders roktConfig:(NSDictionary * _Nullable)roktConfig fontFilesMap:(NSDictionary * _Nullable)fontFilesMap) { - RCTLogWarn(@"[mParticle-Rokt] Old Architecture Implementation"); + _rokt_log(@"[mParticle-Rokt] Old Architecture Implementation"); NSMutableDictionary *finalAttributes = [self convertToMutableDictionaryOfStrings:attributes]; MPRoktConfig *config = [self buildRoktConfigFromDict:roktConfig]; #endif - RCTLogWarn(@"[mParticle-Rokt] selectPlacements called with identifier: %@, attributes count: %lu", identifer, (unsigned long)finalAttributes.count); + _rokt_log(@"[mParticle-Rokt] selectPlacements called with identifier: %@, attributes count: %lu", identifer, (unsigned long)finalAttributes.count); [MParticle _setWrapperSdk_internal:MPWrapperSdkReactNative version:@""]; // Create callback implementation @@ -121,42 +141,42 @@ - (void)selectPlacements:(NSString *)identifer __weak __typeof__(self) weakSelf = self; callbacks.onLoad = ^{ - RCTLogWarn(@"[mParticle-Rokt] onLoad"); + _rokt_log(@"[mParticle-Rokt] onLoad"); [weakSelf.eventManager onRoktCallbackReceived:@"onLoad"]; }; callbacks.onUnLoad = ^{ - RCTLogWarn(@"[mParticle-Rokt] onUnLoad"); + _rokt_log(@"[mParticle-Rokt] onUnLoad"); [weakSelf.eventManager onRoktCallbackReceived:@"onUnLoad"]; }; callbacks.onShouldShowLoadingIndicator = ^{ - RCTLogWarn(@"[mParticle-Rokt] onShouldShowLoadingIndicator"); + _rokt_log(@"[mParticle-Rokt] onShouldShowLoadingIndicator"); [weakSelf.eventManager onRoktCallbackReceived:@"onShouldShowLoadingIndicator"]; }; callbacks.onShouldHideLoadingIndicator = ^{ - RCTLogWarn(@"[mParticle-Rokt] onShouldHideLoadingIndicator"); + _rokt_log(@"[mParticle-Rokt] onShouldHideLoadingIndicator"); [weakSelf.eventManager onRoktCallbackReceived:@"onShouldHideLoadingIndicator"]; }; callbacks.onEmbeddedSizeChange = ^(NSString *placementId, CGFloat height) { - RCTLogWarn(@"[mParticle-Rokt] onEmbeddedSizeChange"); + _rokt_log(@"[mParticle-Rokt] onEmbeddedSizeChange"); [weakSelf.eventManager onWidgetHeightChanges:height placement:placementId]; }; BOOL bridgeNil = (self.bridge == nil); BOOL uiManagerNil = (self.bridge.uiManager == nil); - RCTLogWarn(@"[mParticle-Rokt] bridge %@, uiManager %@", bridgeNil ? @"nil" : @"non-nil", uiManagerNil ? @"nil" : @"non-nil"); + _rokt_log(@"[mParticle-Rokt] bridge %@, uiManager %@", bridgeNil ? @"nil" : @"non-nil", uiManagerNil ? @"nil" : @"non-nil"); if (bridgeNil || uiManagerNil) { - RCTLogWarn(@"[mParticle-Rokt] addUIBlock skipped: self.bridge%@ is nil. selectPlacements will not be called. This can occur in New Architecture bridgeless production builds.", bridgeNil ? @"" : @".uiManager"); + _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"); } else { - RCTLogWarn(@"[mParticle-Rokt] queuing addUIBlock for identifier: %@", identifer); + _rokt_log(@"[mParticle-Rokt] queuing addUIBlock for identifier: %@", identifer); } [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary *viewRegistry) { __strong __typeof__(weakSelf) strongSelf = weakSelf; - RCTLogWarn(@"[mParticle-Rokt] addUIBlock executing for identifier: %@, viewRegistry count: %lu", identifer, (unsigned long)viewRegistry.count); + _rokt_log(@"[mParticle-Rokt] addUIBlock executing for identifier: %@, viewRegistry count: %lu", identifer, (unsigned long)viewRegistry.count); NSMutableDictionary *nativePlaceholders = strongSelf ? [strongSelf getNativePlaceholders:placeholders viewRegistry:viewRegistry] : [NSMutableDictionary dictionary]; @@ -164,14 +184,14 @@ - (void)selectPlacements:(NSString *)identifer [strongSelf subscribeViewEvents:identifer]; } - RCTLogWarn(@"[mParticle-Rokt] calling mParticle Core selectPlacements for: %@", identifer); + _rokt_log(@"[mParticle-Rokt] calling mParticle Core selectPlacements for: %@", identifer); [[[MParticle sharedInstance] rokt] selectPlacements:identifer attributes:finalAttributes embeddedViews:nativePlaceholders config:config callbacks:callbacks]; }]; - RCTLogWarn(@"[mParticle-Rokt] addUIBlock enqueued for identifier: %@", identifer); + _rokt_log(@"[mParticle-Rokt] addUIBlock enqueued for identifier: %@", identifer); } RCT_EXPORT_METHOD(purchaseFinalized : (NSString *)placementId catalogItemId : ( @@ -210,7 +230,7 @@ - (MPColorMode)stringToColorMode:(NSString*)colorString } - (MPRoktConfig *)buildRoktConfigFromDict:(NSDictionary *)configMap { - RCTLogWarn(@"[mParticle-Rokt] buildRoktConfigFromDict: configMap %@", configMap == nil ? @"nil" : [NSString stringWithFormat:@"non-nil (%lu keys)", (unsigned long)configMap.count]); + _rokt_log(@"[mParticle-Rokt] buildRoktConfigFromDict: configMap %@", configMap == nil ? @"nil" : [NSString stringWithFormat:@"non-nil (%lu keys)", (unsigned long)configMap.count]); MPRoktConfig *config = [[MPRoktConfig alloc] init]; BOOL isConfigEmpty = YES; @@ -243,13 +263,13 @@ - (MPRoktConfig *)buildRoktConfigFromDict:(NSDictionary *)config config.cacheDuration = cacheDuration; } - RCTLogWarn(@"[mParticle-Rokt] buildRoktConfigFromDict: returning %@", isConfigEmpty ? @"nil" : @"config"); + _rokt_log(@"[mParticle-Rokt] buildRoktConfigFromDict: returning %@", isConfigEmpty ? @"nil" : @"config"); return isConfigEmpty ? nil : config; } - (void)subscribeViewEvents:(NSString* _Nonnull) viewName { - RCTLogWarn(@"[mParticle-Rokt] subscribeViewEvents for viewName: %@", viewName); + _rokt_log(@"[mParticle-Rokt] subscribeViewEvents for viewName: %@", viewName); if (self.eventManager == nil) { self.eventManager = [RoktEventManager allocWithZone: nil]; } @@ -260,7 +280,7 @@ - (void)subscribeViewEvents:(NSString* _Nonnull) viewName - (NSMutableDictionary *)getNativePlaceholders:(NSDictionary *)placeholders viewRegistry:(NSDictionary *)viewRegistry { - RCTLogWarn(@"[mParticle-Rokt] getNativePlaceholders: placeholders %lu, viewRegistry %lu", (unsigned long)placeholders.count, (unsigned long)viewRegistry.count); + _rokt_log(@"[mParticle-Rokt] getNativePlaceholders: placeholders %lu, viewRegistry %lu", (unsigned long)placeholders.count, (unsigned long)viewRegistry.count); NSMutableDictionary *nativePlaceholders = [[NSMutableDictionary alloc]initWithCapacity:placeholders.count]; for(id key in placeholders){ @@ -282,14 +302,14 @@ - (NSMutableDictionary *)getNativePlaceholders:(NSDictionary *)placeholders view #endif // RCT_NEW_ARCH_ENABLED } - RCTLogWarn(@"[mParticle-Rokt] getNativePlaceholders: resolved %lu native placeholder(s)", (unsigned long)nativePlaceholders.count); + _rokt_log(@"[mParticle-Rokt] getNativePlaceholders: resolved %lu native placeholder(s)", (unsigned long)nativePlaceholders.count); return nativePlaceholders; } #ifdef RCT_NEW_ARCH_ENABLED - (std::shared_ptr)getTurboModule:(const facebook::react::ObjCTurboModule::InitParams &)params { self.bridge = params.instance.bridge; - RCTLogWarn(@"[mParticle-Rokt] getTurboModule: bridge set to %@", self.bridge == nil ? @"nil" : @"non-nil"); + _rokt_log(@"[mParticle-Rokt] getTurboModule: bridge set to %@", self.bridge == nil ? @"nil" : @"non-nil"); return std::make_shared(params); } #endif // RCT_NEW_ARCH_ENABLED From 0df7517bd7a2a05558a08bf26890882eaa47f1b7 Mon Sep 17 00:00:00 2001 From: Brandon Stalnaker Date: Tue, 17 Mar 2026 09:39:02 -0400 Subject: [PATCH 3/3] Add Additional Log throughout the sdk --- ios/RNMParticle/RNMPRokt.mm | 3 +++ ios/RNMParticle/RoktEventManager.m | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/ios/RNMParticle/RNMPRokt.mm b/ios/RNMParticle/RNMPRokt.mm index 760a732..b7cc060 100644 --- a/ios/RNMParticle/RNMPRokt.mm +++ b/ios/RNMParticle/RNMPRokt.mm @@ -184,6 +184,9 @@ - (void)selectPlacements:(NSString *)identifer [strongSelf subscribeViewEvents:identifer]; } + id mpInstance = [MParticle sharedInstance]; + id roktKit = mpInstance ? [mpInstance rokt] : nil; + _rokt_log(@"[mParticle-Rokt] MParticle sharedInstance %@, rokt kit %@", mpInstance ? @"non-nil" : @"nil", roktKit ? @"non-nil" : @"nil"); _rokt_log(@"[mParticle-Rokt] calling mParticle Core selectPlacements for: %@", identifer); [[[MParticle sharedInstance] rokt] selectPlacements:identifer attributes:finalAttributes diff --git a/ios/RNMParticle/RoktEventManager.m b/ios/RNMParticle/RoktEventManager.m index 5369324..a9b211a 100644 --- a/ios/RNMParticle/RoktEventManager.m +++ b/ios/RNMParticle/RoktEventManager.m @@ -1,5 +1,23 @@ #import "RoktEventManager.h" #import +#import + +static os_log_t _rokt_events_os_log(void) { + static os_log_t log; + static dispatch_once_t once; + dispatch_once(&once, ^{ + log = os_log_create("com.mparticle.react-native", "rokt-events"); + }); + return log; +} + +static void _rokt_events_log(NSString *format, ...) { + va_list args; + va_start(args, format); + NSString *msg = [[NSString alloc] initWithFormat:format arguments:args]; + va_end(args); + os_log_with_type(_rokt_events_os_log(), OS_LOG_TYPE_INFO, "%{public}s", [msg UTF8String]); +} @implementation RoktEventManager { @@ -13,17 +31,20 @@ + (id)allocWithZone:(NSZone *)zone { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedInstance = [super allocWithZone:zone]; + _rokt_events_log(@"[mParticle-Rokt] RoktEventManager module alloc"); }); return sharedInstance; } // Will be called when this module's first listener is added. -(void)startObserving { + _rokt_events_log(@"[mParticle-Rokt] RoktEventManager startObserving (JS listener added)"); hasListeners = YES; } // Will be called when this module's last listener is removed, or on dealloc. -(void)stopObserving { + _rokt_events_log(@"[mParticle-Rokt] RoktEventManager stopObserving (no JS listeners)"); hasListeners = NO; } @@ -51,6 +72,7 @@ - (void)onFirstPositiveResponse - (void)onRoktCallbackReceived:(NSString*)eventValue { + _rokt_events_log(@"[mParticle-Rokt] RoktEventManager onRoktCallbackReceived: %@", eventValue ?: @"(nil)"); if (hasListeners) { [self sendEventWithName:@"RoktCallback" body:@{@"callbackValue": eventValue}]; } @@ -58,6 +80,8 @@ - (void)onRoktCallbackReceived:(NSString*)eventValue - (void)onRoktEvents:(MPRoktEvent * _Nonnull)event viewName:(NSString * _Nullable)viewName { + NSString *eventClass = event ? NSStringFromClass([event class]) : @"nil"; + _rokt_events_log(@"[mParticle-Rokt] RoktEventManager onRoktEvents: %@ viewName: %@", eventClass, viewName ?: @"(nil)"); if (hasListeners) { NSString *placementId; NSString *eventName = @"";