diff --git a/packages/react-native/React/Base/RCTBridge.mm b/packages/react-native/React/Base/RCTBridge.mm index 43b8f05d1e8..077a4b103ab 100644 --- a/packages/react-native/React/Base/RCTBridge.mm +++ b/packages/react-native/React/Base/RCTBridge.mm @@ -20,6 +20,7 @@ #import #import #import "RCTDevLoadingViewProtocol.h" +#import "RCTInspectorUtils.h" #import "RCTJSThread.h" #import "RCTLog.h" #import "RCTModuleData.h" @@ -187,8 +188,14 @@ class RCTBridgeHostTargetDelegate : public facebook::react::jsinspector_modern:: facebook::react::jsinspector_modern::HostTargetMetadata getMetadata() override { + auto metadata = [RCTInspectorUtils getHostMetadata]; + return { + .appIdentifier = [metadata.appIdentifier UTF8String], + .deviceName = [metadata.deviceName UTF8String], .integrationName = "iOS Bridge (RCTBridge)", + .platform = [metadata.platform UTF8String], + .reactNativeVersion = [metadata.reactNativeVersion UTF8String], }; } diff --git a/packages/react-native/React/DevSupport/RCTInspectorUtils.h b/packages/react-native/React/DevSupport/RCTInspectorUtils.h new file mode 100644 index 00000000000..ce8bb9507c4 --- /dev/null +++ b/packages/react-native/React/DevSupport/RCTInspectorUtils.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +// This is a subset of jsinspector_modern::HostTargetMetadata with ObjC types, +// containing the nonnull members implemented by getHostMetadata. +@interface CommonHostMetadata : NSObject + +@property (nonatomic, strong) NSString *appIdentifier; +@property (nonatomic, strong) NSString *deviceName; +@property (nonatomic, strong) NSString *platform; +@property (nonatomic, strong) NSString *reactNativeVersion; + +@end + +@interface RCTInspectorUtils : NSObject + ++ (CommonHostMetadata *)getHostMetadata; + +@end diff --git a/packages/react-native/React/DevSupport/RCTInspectorUtils.mm b/packages/react-native/React/DevSupport/RCTInspectorUtils.mm new file mode 100644 index 00000000000..6b0611dea53 --- /dev/null +++ b/packages/react-native/React/DevSupport/RCTInspectorUtils.mm @@ -0,0 +1,41 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTInspectorUtils.h" + +#import +#import +#import + +@implementation CommonHostMetadata +@end + +@implementation RCTInspectorUtils + ++ (CommonHostMetadata *)getHostMetadata +{ + UIDevice *device = [UIDevice currentDevice]; + auto version = RCTGetReactNativeVersion(); + + CommonHostMetadata *metadata = [[CommonHostMetadata alloc] init]; + + metadata.appIdentifier = [[NSBundle mainBundle] bundleIdentifier]; + metadata.platform = RCTPlatformName; + metadata.deviceName = [device name]; + metadata.reactNativeVersion = + [NSString stringWithFormat:@"%i.%i.%i%@", + [version[@"minor"] intValue], + [version[@"major"] intValue], + [version[@"patch"] intValue], + [version[@"prerelease"] isKindOfClass:[NSNull class]] + ? @"" + : [@"-" stringByAppendingString:[version[@"prerelease"] stringValue]]]; + + return metadata; +} + +@end diff --git a/packages/react-native/ReactCommon/jsinspector-modern/HostTarget.cpp b/packages/react-native/ReactCommon/jsinspector-modern/HostTarget.cpp index 00810280c05..6c74a7dd9c3 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/HostTarget.cpp +++ b/packages/react-native/ReactCommon/jsinspector-modern/HostTarget.cpp @@ -223,7 +223,21 @@ bool HostTargetController::decrementPauseOverlayCounter() { folly::dynamic hostMetadataToDynamic(const HostTargetMetadata& metadata) { folly::dynamic result = folly::dynamic::object; - result["integrationName"] = metadata.integrationName.value_or(nullptr); + if (metadata.appIdentifier) { + result["appIdentifier"] = metadata.appIdentifier.value(); + } + if (metadata.deviceName) { + result["deviceName"] = metadata.deviceName.value(); + } + if (metadata.integrationName) { + result["integrationName"] = metadata.integrationName.value(); + } + if (metadata.platform) { + result["platform"] = metadata.platform.value(); + } + if (metadata.reactNativeVersion) { + result["reactNativeVersion"] = metadata.reactNativeVersion.value(); + } return result; } diff --git a/packages/react-native/ReactCommon/jsinspector-modern/HostTarget.h b/packages/react-native/ReactCommon/jsinspector-modern/HostTarget.h index 9fb5ab26f36..6a56ea24079 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/HostTarget.h +++ b/packages/react-native/ReactCommon/jsinspector-modern/HostTarget.h @@ -37,7 +37,11 @@ class HostCommandSender; class HostTarget; struct HostTargetMetadata { + std::optional appIdentifier; + std::optional deviceName; std::optional integrationName; + std::optional platform; + std::optional reactNativeVersion; }; /** @@ -90,7 +94,8 @@ class HostTargetDelegate { virtual ~HostTargetDelegate(); /** - * Returns a metadata object describing the host. + * Returns a metadata object describing the host. This is called on an + * initial response to @cdp ReactNativeApplication.enable. */ virtual HostTargetMetadata getMetadata() = 0; diff --git a/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm b/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm index 8e0b105f2c5..f575d037aad 100644 --- a/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm +++ b/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm @@ -13,6 +13,7 @@ #import #import #import +#import #import #import #import @@ -42,8 +43,14 @@ class RCTHostHostTargetDelegate : public facebook::react::jsinspector_modern::Ho jsinspector_modern::HostTargetMetadata getMetadata() override { + auto metadata = [RCTInspectorUtils getHostMetadata]; + return { + .appIdentifier = [metadata.appIdentifier UTF8String], + .deviceName = [metadata.deviceName UTF8String], .integrationName = "iOS Bridgeless (RCTHost)", + .platform = [metadata.platform UTF8String], + .reactNativeVersion = [metadata.reactNativeVersion UTF8String], }; }