Skip to content

Commit bb46323

Browse files
committed
feat(logging): add public log listener methods
Adds the following new public methods: * OneSignal.Debug.addLogListener * OneSignal.Debug.removeLogListener These new methods provide a way to capture all SDK log entires at runtime, allowing the app developer to store these and/or send them to their server. The log listener is independent of logLevel, all message are always sent to listeners.
1 parent 7b2a899 commit bb46323

File tree

4 files changed

+90
-1
lines changed

4 files changed

+90
-1
lines changed

iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2678,9 +2678,9 @@
26782678
4529DF0B1FA932AC00CEAB1D /* OneSignalTrackFirebaseAnalytics.m */,
26792679
DE7D1831270279D9002D3A5D /* OSNotificationClasses.h */,
26802680
DE7D183527027AA0002D3A5D /* OneSignalLog.h */,
2681+
DE7D183327027A73002D3A5D /* OneSignalLog.m */,
26812682
3CCF44BC299B17290021964D /* OneSignalWrapper.h */,
26822683
3CCF44BD299B17290021964D /* OneSignalWrapper.m */,
2683-
DE7D183327027A73002D3A5D /* OneSignalLog.m */,
26842684
DE7D187627037A16002D3A5D /* OneSignalCoreHelper.h */,
26852685
DE7D187827037A26002D3A5D /* OneSignalCoreHelper.m */,
26862686
7AE28B8725B8ADF400529100 /* OSMacros.h */,

iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalLog.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,41 @@ typedef NS_ENUM(NSUInteger, ONE_S_LOG_LEVEL) {
3636
ONE_S_LL_VERBOSE
3737
};
3838

39+
@interface OneSignalLogEvent : NSObject
40+
@property(readonly)ONE_S_LOG_LEVEL level;
41+
@property(readonly, nonnull)NSString *entry;
42+
@end
43+
44+
@protocol OSLogListener <NSObject>
45+
- (void)onLogEvent:(OneSignalLogEvent *_Nonnull)event;
46+
@end
47+
3948
@protocol OSDebug <NSObject>
49+
/**
50+
The log level the OneSignal SDK should be writing to the Xcode log. Defaults to [LogLevel.WARN].
51+
52+
WARNING: This should not be set higher than LogLevel.WARN in a production setting.
53+
*/
4054
+ (void)setLogLevel:(ONE_S_LOG_LEVEL)logLevel;
55+
/**
56+
The log level the OneSignal SDK should be showing as a modal. Defaults to [LogLevel.NONE].
57+
58+
WARNING: This should not be used in a production setting.
59+
*/
4160
+ (void)setAlertLevel:(ONE_S_LOG_LEVEL)logLevel NS_REFINED_FOR_SWIFT;
4261
+ (void)_dump;
62+
/**
63+
Add a listener to receive all logging messages the SDK produces.
64+
Useful to capture and send logs to your server.
65+
66+
NOTE: All log messages are always passed, LogLevel has no effect on this.
67+
*/
68+
+ (void)addLogListener:(NSObject<OSLogListener>*_Nonnull)listener NS_REFINED_FOR_SWIFT;
69+
/**
70+
Removes a listener added by addLogListener
71+
*/
72+
+ (void)removeLogListener:(NSObject<OSLogListener>*_Nonnull)listener NS_REFINED_FOR_SWIFT;
73+
4374
@end
4475

4576
@interface OneSignalLog : NSObject <OSDebug>

iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalLog.m

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@
2929
#import "OneSignalLog.h"
3030
#import "OSDialogInstanceManager.h"
3131

32+
@implementation OneSignalLogEvent
33+
- (instancetype)initWithLevel:(ONE_S_LOG_LEVEL)level entry:(NSString*)entry {
34+
_level = level;
35+
_entry = entry;
36+
return self;
37+
}
38+
@end
39+
3240
/**
3341
Implements the Log Level methods of protocol `OSDebug`.
3442
The `_dump` method will be implemented in OneSignal module.
@@ -42,6 +50,15 @@ @implementation OneSignalLog
4250
return self;
4351
}
4452

53+
+ (NSMutableArray<NSObject<OSLogListener> *>*)logListeners {
54+
static NSMutableArray<NSObject<OSLogListener> *> *_logListeners;
55+
static dispatch_once_t onceToken;
56+
dispatch_once(&onceToken, ^{
57+
_logListeners = [NSMutableArray new];
58+
});
59+
return _logListeners;
60+
}
61+
4562
+ (void)setLogLevel:(ONE_S_LOG_LEVEL)nsLogLevel {
4663
_nsLogLevel = nsLogLevel;
4764
}
@@ -50,6 +67,18 @@ + (void)setAlertLevel:(ONE_S_LOG_LEVEL)logLevel {
5067
_alertLogLevel = logLevel;
5168
}
5269

70+
+ (void)addLogListener:(NSObject<OSLogListener>*_Nonnull)listener {
71+
@synchronized(self.logListeners) {
72+
[self.logListeners addObject:listener];
73+
}
74+
}
75+
76+
+ (void)removeLogListener:(NSObject<OSLogListener>*_Nonnull)listener {
77+
@synchronized(self.logListeners) {
78+
[self.logListeners removeObject:listener];
79+
}
80+
}
81+
5382
+ (void)_dump {}
5483

5584
+ (void)onesignalLog:(ONE_S_LOG_LEVEL)logLevel message:(NSString* _Nonnull)message {
@@ -92,6 +121,15 @@ void onesignal_Log(ONE_S_LOG_LEVEL logLevel, NSString* message) {
92121
if (logLevel <= _alertLogLevel) {
93122
[[OSDialogInstanceManager sharedInstance] presentDialogWithTitle:levelString withMessage:message withActions:nil cancelTitle:NSLocalizedString(@"Close", @"Close button") withActionCompletion:nil];
94123
}
124+
125+
@synchronized(OneSignalLog.logListeners) {
126+
for (NSObject<OSLogListener> *listener in OneSignalLog.logListeners) {
127+
if ([listener respondsToSelector:@selector(onLogEvent:)]) {
128+
OneSignalLogEvent *event = [[OneSignalLogEvent alloc] initWithLevel:logLevel entry:[levelString stringByAppendingString:message]];
129+
[listener onLogEvent:event];
130+
}
131+
}
132+
}
95133
}
96134

97135
@end

iOS_SDK/OneSignalSDK/Source/OneSignalSwiftInterface.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,29 @@ public extension OneSignal {
7171
}
7272

7373
public extension OSDebug {
74+
/**
75+
The log level the OneSignal SDK should be showing as a modal. Defaults to [LogLevel.NONE].
76+
77+
WARNING: This should not be used in a production setting.
78+
*/
7479
static func setAlertLevel(_ logLevel: ONE_S_LOG_LEVEL) {
7580
__setAlert(logLevel)
7681
}
82+
/**
83+
Add a listener to receive all logging messages the SDK produces.
84+
Useful to capture and send logs to your server.
85+
86+
NOTE: All log messages are always passed, LogLevel has no effect on this.
87+
*/
88+
static func addLogListener(_ listener: OSLogListener) {
89+
__add(listener)
90+
}
91+
/**
92+
Removes a listener added by addLogListener
93+
*/
94+
static func removeLogListener(_ listener: OSLogListener) {
95+
__remove(listener)
96+
}
7797
}
7898

7999
public extension OSInAppMessages {

0 commit comments

Comments
 (0)