From 68a57aed54f4b6321b47f19bb18d2ce0fbbc98a9 Mon Sep 17 00:00:00 2001 From: Blake Friedman Date: Fri, 13 Oct 2023 04:57:49 -0700 Subject: [PATCH] Add log message if App moves to background Summary: When the user attaches a debugger, and the app moves to the background the debugging session persists. This sends a CDP console.info so the debugging user is aware of the app's state. It is an easy state to get into when debugging on multiple emulators. Differential Revision: D49956535 --- .../RCTInspectorPackagerConnection.h | 1 + .../RCTInspectorPackagerConnection.m | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/packages/react-native/React/Inspector/RCTInspectorPackagerConnection.h b/packages/react-native/React/Inspector/RCTInspectorPackagerConnection.h index 96bb8416b772e7..26c56f8b967d7d 100644 --- a/packages/react-native/React/Inspector/RCTInspectorPackagerConnection.h +++ b/packages/react-native/React/Inspector/RCTInspectorPackagerConnection.h @@ -30,6 +30,7 @@ typedef RCTBundleStatus * (^RCTBundleStatusProvider)(void); @interface RCTInspectorRemoteConnection : NSObject - (void)onMessage:(NSString *)message; - (void)onDisconnect; +- (void)handleBackgroundEvent:(NSNotification *)notification; @end #endif diff --git a/packages/react-native/React/Inspector/RCTInspectorPackagerConnection.m b/packages/react-native/React/Inspector/RCTInspectorPackagerConnection.m index 3d16997273dd67..ae28f4c7fa5476 100644 --- a/packages/react-native/React/Inspector/RCTInspectorPackagerConnection.m +++ b/packages/react-native/React/Inspector/RCTInspectorPackagerConnection.m @@ -328,10 +328,49 @@ - (instancetype)initWithPackagerConnection:(RCTInspectorPackagerConnection *)own if (self = [super init]) { _owningPackagerConnection = owningPackagerConnection; _pageId = pageId; + [self addObserverFor:UIApplicationDidEnterBackgroundNotification]; + [self addObserverFor:UIApplicationWillEnterForegroundNotification]; } return self; } +- (void)addObserverFor:(NSString *)notificationName +{ + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(handleBackgroundEvent:) + name:notificationName + object:nil]; +} + +- (void)consoleInfo:(NSString *)message format:(NSString *)format +{ + if (!message) { + return; + } + NSNumber *now = @([[NSDate date] timeIntervalSince1970] * 1000); + NSDictionary *json = @{ + @"method" : @"Runtime.consoleAPICalled", + @"params" : @{@"type" : @"info", @"args" : format == nil ? @[ message ] : @[ message, format ], @"timestamp" : now} + }; + NSError *error = nil; + NSData *data = [NSJSONSerialization dataWithJSONObject:json options:0 error:&error]; + if (error != nil) { + NSLog(@"Unable to serialize a console.warn() message: %@", error); + return; + } + NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + [self onMessage:str]; +} + +- (void)handleBackgroundEvent:(NSNotification *)notification +{ + if ([notification.name isEqualToString:UIApplicationWillEnterForegroundNotification]) { + [self consoleInfo:@"App has moved into the %cforeground" format:@"font-weight: bold"]; + } else if ([notification.name isEqualToString:UIApplicationDidEnterBackgroundNotification]) { + [self consoleInfo:@"App has moved into the %cbackground" format:@"font-weight: bold"]; + } +} + - (void)onMessage:(NSString *)message { [_owningPackagerConnection sendWrappedEvent:_pageId message:message];