Skip to content

Commit e8566db

Browse files
coadofacebook-github-bot
authored andcommitted
iOS: Make RCTPackagerConnection instance of RCTDevSettings and use bundle config (#54258)
Summary: ## Summary It associates `RCTPackagerConnection` (previously singleton) with the `RCTDevSettings` instance, which has access to the `RCTBundleManager`, which contains the specified configuration object. The connection is now established in the `RCTDevSettings initialize` method, called after the bundle manager is set by invoking the new `startWithBundleManager` method on the `RCTPackagerConnection`. ## Changelog: [IOS][CHANGED] - Make `RCTPackagerConnection` instance of the `RCTDevSettings` and use bundle config. Differential Revision: D85247267
1 parent d2f2b07 commit e8566db

File tree

6 files changed

+71
-45
lines changed

6 files changed

+71
-45
lines changed

packages/react-native/React/CoreModules/RCTDevSettings.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
#import <React/RCTEventEmitter.h>
1212
#import <React/RCTInitializing.h>
1313

14+
@class RCTPackagerConnection;
15+
1416
@protocol RCTPackagerClientMethod;
1517

1618
/**
@@ -85,6 +87,8 @@
8587
*/
8688
@property (nonatomic, assign) BOOL isPerfMonitorShown;
8789

90+
@property (nonatomic, readonly) RCTPackagerConnection *packagerConnection;
91+
8892
/**
8993
* Toggle the element inspector.
9094
*/

packages/react-native/React/CoreModules/RCTDevSettings.mm

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,12 @@
3232

3333
static NSString *const kRCTDevSettingsUserDefaultsKey = @"RCTDevMenu";
3434

35+
#if RCT_DEV_MENU
36+
#import <React/RCTPackagerConnection.h>
37+
#endif
38+
3539
#if RCT_DEV_SETTINGS_ENABLE_PACKAGER_CONNECTION
3640
#import <React/RCTPackagerClient.h>
37-
#import <React/RCTPackagerConnection.h>
3841
#endif
3942

4043
#if RCT_ENABLE_INSPECTOR
@@ -145,6 +148,9 @@ - (instancetype)init
145148
};
146149
RCTDevSettingsUserDefaultsDataSource *dataSource =
147150
[[RCTDevSettingsUserDefaultsDataSource alloc] initWithDefaultValues:defaultValues];
151+
#if RCT_DEV
152+
_packagerConnection = [RCTPackagerConnection new];
153+
#endif
148154
_isShakeGestureEnabled = true;
149155
return [self initWithDataSource:dataSource];
150156
}
@@ -178,18 +184,27 @@ - (instancetype)initWithDataSource:(id<RCTDevSettingsDataSource>)dataSource
178184

179185
- (void)initialize
180186
{
187+
#if RCT_DEV
188+
[_packagerConnection startWithBundleManager:_bundleManager];
189+
#endif
190+
181191
#if RCT_DEV_SETTINGS_ENABLE_PACKAGER_CONNECTION
182192
if (numInitializedModules++ == 0) {
183-
reloadToken = [[RCTPackagerConnection sharedPackagerConnection]
193+
reloadToken = [_packagerConnection
184194
addNotificationHandler:^(id params) {
185195
RCTTriggerReloadCommandListeners(@"Global hotkey");
186196
}
187197
queue:dispatch_get_main_queue()
188198
forMethod:@"reload"];
189199
#if RCT_DEV_MENU
190-
devMenuToken = [[RCTPackagerConnection sharedPackagerConnection]
200+
__weak __typeof(self) weakSelf = self;
201+
devMenuToken = [_packagerConnection
191202
addNotificationHandler:^(id params) {
192-
[[self.moduleRegistry moduleForName:"DevMenu"] show];
203+
__typeof(self) strongSelf = weakSelf;
204+
if (strongSelf == nullptr) {
205+
return;
206+
}
207+
[[strongSelf.moduleRegistry moduleForName:"DevMenu"] show];
193208
}
194209
queue:dispatch_get_main_queue()
195210
forMethod:@"devMenu"];
@@ -240,9 +255,9 @@ - (void)invalidate
240255
[super invalidate];
241256
#if RCT_DEV_SETTINGS_ENABLE_PACKAGER_CONNECTION
242257
if (--numInitializedModules == 0) {
243-
[[RCTPackagerConnection sharedPackagerConnection] removeHandler:reloadToken];
258+
[_packagerConnection removeHandler:reloadToken];
244259
#if RCT_DEV_MENU
245-
[[RCTPackagerConnection sharedPackagerConnection] removeHandler:devMenuToken];
260+
[_packagerConnection removeHandler:devMenuToken];
246261
#endif
247262
}
248263
#endif
@@ -425,7 +440,7 @@ - (void)setExecutorClass:(Class)executorClass
425440
- (void)addHandler:(id<RCTPackagerClientMethod>)handler forPackagerMethod:(NSString *)name
426441
{
427442
#if RCT_DEV_SETTINGS_ENABLE_PACKAGER_CONNECTION
428-
[[RCTPackagerConnection sharedPackagerConnection] addHandler:handler forMethod:name];
443+
[_packagerConnection addHandler:handler forMethod:name];
429444
#endif
430445
}
431446

packages/react-native/React/DevSupport/RCTPackagerConnection.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#import <Foundation/Foundation.h>
99

10+
#import <React/RCTBundleManager.h>
1011
#import <React/RCTDefines.h>
1112

1213
#if RCT_DEV
@@ -24,8 +25,6 @@ typedef void (^RCTConnectedHandler)(void);
2425
/** Encapsulates singleton connection to React Native packager. */
2526
@interface RCTPackagerConnection : NSObject
2627

27-
+ (instancetype)sharedPackagerConnection;
28-
2928
/**
3029
* Registers a handler for a notification broadcast from the packager. An
3130
* example is "reload" - an instruction to reload from the packager.
@@ -62,6 +61,9 @@ typedef void (^RCTConnectedHandler)(void);
6261
/** Reconnect with given packager server, if packagerServerHostPort has changed. */
6362
- (void)reconnect:(NSString *)packagerServerHostPort;
6463

64+
/** starts packager connection with configuration from the bundle manager */
65+
- (void)startWithBundleManager:(RCTBundleManager *)bundleManager;
66+
6567
/**
6668
* Historically no distinction was made between notification and request
6769
* handlers. If you use this method, it will be registered as *both* a

packages/react-native/React/DevSupport/RCTPackagerConnection.mm

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
#import <React/RCTAssert.h>
1515
#import <React/RCTBridge.h>
16+
#import <React/RCTBundleManager.h>
1617
#import <React/RCTBundleURLProvider.h>
1718
#import <React/RCTConstants.h>
1819
#import <React/RCTConvert.h>
@@ -50,43 +51,13 @@ @implementation RCTPackagerConnection {
5051
std::vector<Registration<RCTNotificationHandler>> _notificationRegistrations;
5152
std::vector<Registration<RCTRequestHandler>> _requestRegistrations;
5253
std::vector<Registration<RCTConnectedHandler>> _connectedRegistrations;
53-
}
54-
55-
+ (instancetype)sharedPackagerConnection
56-
{
57-
static RCTPackagerConnection *connection;
58-
static dispatch_once_t onceToken;
59-
dispatch_once(&onceToken, ^{
60-
connection = [RCTPackagerConnection new];
61-
});
62-
return connection;
54+
RCTBundleManager *_bundleManager;
6355
}
6456

6557
- (instancetype)init
6658
{
6759
if (self = [super init]) {
6860
_nextToken = 1; // Prevent randomly erasing a handler if you pass a bogus 0 token
69-
_serverHostPortForSocket = [[RCTBundleURLProvider sharedSettings] packagerServerHostPort];
70-
_serverSchemeForSocket = [[RCTBundleURLProvider sharedSettings] packagerScheme];
71-
_socket = socketForLocation(_serverHostPortForSocket, _serverSchemeForSocket);
72-
_socket.delegate = self;
73-
[_socket start];
74-
75-
RCTPackagerConnection *const __weak weakSelf = self;
76-
_bundleURLChangeObserver =
77-
[[NSNotificationCenter defaultCenter] addObserverForName:RCTBundleURLProviderUpdatedNotification
78-
object:nil
79-
queue:[NSOperationQueue mainQueue]
80-
usingBlock:^(NSNotification *_Nonnull __unused note) {
81-
[weakSelf bundleURLSettingsChanged];
82-
}];
83-
_reloadWithPotentiallyNewURLObserver =
84-
[[NSNotificationCenter defaultCenter] addObserverForName:RCTTriggerReloadCommandNotification
85-
object:nil
86-
queue:[NSOperationQueue mainQueue]
87-
usingBlock:^(NSNotification *_Nonnull __unused note) {
88-
[weakSelf bundleURLSettingsChanged];
89-
}];
9061
}
9162
return self;
9263
}
@@ -119,6 +90,32 @@ - (instancetype)init
11990
return [[RCTReconnectingWebSocket alloc] initWithURL:components.URL queue:queue];
12091
}
12192

93+
- (void)startWithBundleManager:(RCTBundleManager *)bundleManager
94+
{
95+
_serverHostPortForSocket = [bundleManager.bundleConfig getPackagerServerHost];
96+
_serverSchemeForSocket = [bundleManager.bundleConfig getPackagerServerScheme];
97+
_socket = socketForLocation(_serverHostPortForSocket, _serverSchemeForSocket);
98+
_socket.delegate = self;
99+
[_socket start];
100+
_bundleManager = bundleManager;
101+
102+
RCTPackagerConnection *const __weak weakSelf = self;
103+
_bundleURLChangeObserver =
104+
[[NSNotificationCenter defaultCenter] addObserverForName:RCTBundleURLProviderUpdatedNotification
105+
object:nil
106+
queue:[NSOperationQueue mainQueue]
107+
usingBlock:^(NSNotification *_Nonnull __unused note) {
108+
[weakSelf bundleURLSettingsChanged];
109+
}];
110+
_reloadWithPotentiallyNewURLObserver =
111+
[[NSNotificationCenter defaultCenter] addObserverForName:RCTTriggerReloadCommandNotification
112+
object:nil
113+
queue:[NSOperationQueue mainQueue]
114+
usingBlock:^(NSNotification *_Nonnull __unused note) {
115+
[weakSelf bundleURLSettingsChanged];
116+
}];
117+
}
118+
122119
- (void)stop
123120
{
124121
std::lock_guard<std::mutex> l(_mutex);
@@ -144,7 +141,7 @@ - (void)reconnect:(NSString *)packagerServerHostPort
144141
return; // already stopped
145142
}
146143

147-
NSString *const serverScheme = [[RCTBundleURLProvider sharedSettings] packagerScheme];
144+
NSString *const serverScheme = [_bundleManager.bundleConfig getPackagerServerScheme];
148145
if ([packagerServerHostPort isEqual:_serverHostPortForSocket] && [serverScheme isEqual:_serverSchemeForSocket]) {
149146
return; // unchanged
150147
}
@@ -161,7 +158,7 @@ - (void)reconnect:(NSString *)packagerServerHostPort
161158
- (void)bundleURLSettingsChanged
162159
{
163160
// Will only reconnect if `packagerServerHostPort` has actually changed
164-
[self reconnect:[[RCTBundleURLProvider sharedSettings] packagerServerHostPort]];
161+
[self reconnect:[_bundleManager.bundleConfig getPackagerServerHost]];
165162
}
166163

167164
- (RCTHandlerToken)addNotificationHandler:(RCTNotificationHandler)handler

packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,9 @@ - (instancetype)initWithBundleURLProvider:(RCTHostBundleURLProvider)provider
196196
return nil;
197197
}
198198

199-
return strongSelf->_bundleURL;
199+
return [strongSelf->_bundleManager.bundleConfig getBundleURL:^NSURL * {
200+
return strongSelf->_bundleURL;
201+
}];
200202
};
201203

202204
auto bundleURLSetter = ^(NSURL *bundleURL_) {
@@ -209,7 +211,9 @@ - (instancetype)initWithBundleURLProvider:(RCTHostBundleURLProvider)provider
209211
return nil;
210212
}
211213

212-
return strongSelf->_bundleURLProvider();
214+
return [strongSelf->_bundleManager.bundleConfig getBundleURL:^NSURL * {
215+
return strongSelf->_bundleURLProvider();
216+
}];
213217
};
214218

215219
[_bundleManager setBridgelessBundleURLGetter:bundleURLGetter

packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTInstance.mm

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,11 @@ - (void)_loadJSBundle:(NSURL *)sourceURL
535535
{
536536
id<RCTDevLoadingViewProtocol> loadingView =
537537
(id<RCTDevLoadingViewProtocol>)[_turboModuleManager moduleForName:"DevLoadingView"];
538-
[loadingView showWithURL:sourceURL];
538+
// When the bundleFilePath is set in the RCTBundleConfiguration the Metro connection
539+
// shouldn't be suggested/required.
540+
if (_bridgeModuleDecorator.bundleManager.bundleConfig.bundleFilePath == nullptr) {
541+
[loadingView showWithURL:sourceURL];
542+
}
539543
}
540544
#endif
541545

0 commit comments

Comments
 (0)