Skip to content

Commit 8d3b6bc

Browse files
chore: Add Additonal Diagnostic Logs (#292)
1 parent f48e90e commit 8d3b6bc

2 files changed

Lines changed: 94 additions & 11 deletions

File tree

ios/RNMParticle/RNMPRokt.mm

Lines changed: 70 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,33 @@
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
6589
static 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
98129
RCT_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

147200
RCT_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

ios/RNMParticle/RoktEventManager.m

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,23 @@
11
#import "RoktEventManager.h"
22
#import <mParticle_Apple_SDK/mParticle_Apple_SDK-Swift.h>
3+
#import <os/log.h>
4+
5+
static os_log_t _rokt_events_os_log(void) {
6+
static os_log_t log;
7+
static dispatch_once_t once;
8+
dispatch_once(&once, ^{
9+
log = os_log_create("com.mparticle.react-native", "rokt-events");
10+
});
11+
return log;
12+
}
13+
14+
static void _rokt_events_log(NSString *format, ...) {
15+
va_list args;
16+
va_start(args, format);
17+
NSString *msg = [[NSString alloc] initWithFormat:format arguments:args];
18+
va_end(args);
19+
os_log_with_type(_rokt_events_os_log(), OS_LOG_TYPE_INFO, "%{public}s", [msg UTF8String]);
20+
}
321

422
@implementation RoktEventManager
523
{
@@ -13,17 +31,20 @@ + (id)allocWithZone:(NSZone *)zone {
1331
static dispatch_once_t onceToken;
1432
dispatch_once(&onceToken, ^{
1533
sharedInstance = [super allocWithZone:zone];
34+
_rokt_events_log(@"[mParticle-Rokt] RoktEventManager module alloc");
1635
});
1736
return sharedInstance;
1837
}
1938

2039
// Will be called when this module's first listener is added.
2140
-(void)startObserving {
41+
_rokt_events_log(@"[mParticle-Rokt] RoktEventManager startObserving (JS listener added)");
2242
hasListeners = YES;
2343
}
2444

2545
// Will be called when this module's last listener is removed, or on dealloc.
2646
-(void)stopObserving {
47+
_rokt_events_log(@"[mParticle-Rokt] RoktEventManager stopObserving (no JS listeners)");
2748
hasListeners = NO;
2849
}
2950

@@ -51,13 +72,16 @@ - (void)onFirstPositiveResponse
5172

5273
- (void)onRoktCallbackReceived:(NSString*)eventValue
5374
{
75+
_rokt_events_log(@"[mParticle-Rokt] RoktEventManager onRoktCallbackReceived: %@", eventValue ?: @"(nil)");
5476
if (hasListeners) {
5577
[self sendEventWithName:@"RoktCallback" body:@{@"callbackValue": eventValue}];
5678
}
5779
}
5880

5981
- (void)onRoktEvents:(MPRoktEvent * _Nonnull)event viewName:(NSString * _Nullable)viewName
6082
{
83+
NSString *eventClass = event ? NSStringFromClass([event class]) : @"nil";
84+
_rokt_events_log(@"[mParticle-Rokt] RoktEventManager onRoktEvents: %@ viewName: %@", eventClass, viewName ?: @"(nil)");
6185
if (hasListeners) {
6286
NSString *placementId;
6387
NSString *eventName = @"";

0 commit comments

Comments
 (0)