Skip to content

Commit b2c8410

Browse files
committed
chore: fix broken APIs on iOS
1 parent 3479158 commit b2c8410

3 files changed

Lines changed: 71 additions & 15 deletions

File tree

ios/Modules/Helper/DevHelper.swift

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import Foundation
12
import React
23

34
public class DevHelper {
@@ -20,7 +21,47 @@ public class DevHelper {
2021

2122
public static func setDebugMode(enabled: Bool) {
2223
AppPreferences.remoteDebuggingEnabled = enabled
23-
devSettings?.isDebuggingRemotely = enabled
24+
25+
// RN <= 0.82 exposed isDebuggingRemotely on RCTDevSettings.
26+
// RN 0.83+ removed that toggle and moved to on-device debugging tooling.
27+
if let devSettings,
28+
devSettings.responds(to: NSSelectorFromString("setIsDebuggingRemotely:")) {
29+
devSettings.setValue(enabled, forKey: "isDebuggingRemotely")
30+
return
31+
}
32+
33+
if enabled {
34+
openDebuggerIfAvailable()
35+
} else {
36+
disableDebuggerIfAvailable()
37+
}
38+
}
39+
40+
private static func openDebuggerIfAvailable() {
41+
guard let bundleURL = ReactNative.shared.bundleURL(),
42+
let inspectorHelperClass = NSClassFromString("RCTInspectorDevServerHelper") as? NSObject.Type else {
43+
return
44+
}
45+
46+
let selector = NSSelectorFromString("openDebugger:withErrorMessage:")
47+
if inspectorHelperClass.responds(to: selector) {
48+
_ = inspectorHelperClass.perform(
49+
selector,
50+
with: bundleURL,
51+
with: "Failed to open debugger. Please check that the dev server is running and reload the app."
52+
)
53+
}
54+
}
55+
56+
private static func disableDebuggerIfAvailable() {
57+
guard let inspectorHelperClass = NSClassFromString("RCTInspectorDevServerHelper") as? NSObject.Type else {
58+
return
59+
}
60+
61+
let selector = NSSelectorFromString("disableDebugger")
62+
if inspectorHelperClass.responds(to: selector) {
63+
_ = inspectorHelperClass.perform(selector)
64+
}
2465
}
2566

2667
public static func hideDevLoadingView() {

ios/Modules/Helper/ReactAppProvider.swift

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,54 @@
11
import UIKit
22
import React
33
import React_RCTAppDelegate
4-
import ReactAppDependencyProvider
54

6-
open class ReactAppProvider: RCTAppDelegate {
5+
open class ReactAppProvider: RCTDefaultReactNativeFactoryDelegate, UIApplicationDelegate {
76

87
public static let defaultName = "App"
8+
9+
public var window: UIWindow?
10+
public var reactNativeFactory: RCTReactNativeFactory?
11+
public var moduleName: String = defaultName
912

1013
var reactRootViewName: String = defaultName
1114

12-
public func setUpProvider(moduleName: String = ReactAppProvider.defaultName, reactRootViewName: String = ReactAppProvider.defaultName) {
15+
public func setUpProvider(
16+
moduleName: String = ReactAppProvider.defaultName,
17+
reactRootViewName: String = ReactAppProvider.defaultName,
18+
dependencyProvider: (any RCTDependencyProvider)? = nil
19+
) {
1320
self.moduleName = moduleName
1421
self.reactRootViewName = reactRootViewName
15-
automaticallyLoadReactNativeWindow = false
16-
dependencyProvider = RCTAppDependencyProvider()
22+
if let dependencyProvider {
23+
self.dependencyProvider = dependencyProvider
24+
}
1725
window = MendixReactWindow(frame: UIScreen.main.bounds)
26+
reactNativeFactory = RCTReactNativeFactory(delegate: self)
1827
}
19-
20-
public override func sourceURL(for bridge: RCTBridge) -> URL? {
21-
return self.bundleURL()
28+
29+
open func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
30+
true
2231
}
2332

2433
open override func bundleURL() -> URL? {
2534
return ReactNative.shared.bundleURL()
2635
}
36+
37+
open override func sourceURL(for bridge: RCTBridge) -> URL? {
38+
return self.bundleURL()
39+
}
2740

2841
public func setReactViewController(_ controller: UIViewController) {
2942
controller.view = reactAppView()
3043
changeRoot(to: controller)
3144
}
3245

3346
public func reactAppView() -> UIView? {
34-
let view = rootViewFactory().view(withModuleName: reactRootViewName)
47+
guard let view = reactNativeFactory?.rootViewFactory.view(withModuleName: reactRootViewName) else {
48+
return nil
49+
}
3550
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
36-
view.frame = window.rootViewController?.view.frame ?? .zero
51+
view.frame = window?.rootViewController?.view.frame ?? .zero
3752
return view
3853
}
3954

@@ -53,12 +68,12 @@ open class ReactAppProvider: RCTAppDelegate {
5368
}
5469

5570
public func changeRoot(to controller: UIViewController) {
56-
window.rootViewController = controller
57-
window.makeKeyAndVisible()
71+
window?.rootViewController = controller
72+
window?.makeKeyAndVisible()
5873
}
5974

6075
public var rootView: UIView? {
61-
return window.rootViewController?.view
76+
return window?.rootViewController?.view
6277
}
6378

6479
public static func getModule<T: NSObject>(type: T.Type) -> T? {

ios/Modules/ReactNative.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ open class ReactNative: NSObject, RCTReloadListener {
4949
ReactAppProvider.shared()?.setReactViewController(mendixApp.reactLoading?.instantiateInitialViewController() ?? UIViewController())
5050

5151
DevHelper.devSettings?.isShakeToShowDevMenuEnabled = false
52-
DevHelper.devSettings?.isDebuggingRemotely = AppPreferences.devModeEnabled && AppPreferences.remoteDebuggingEnabled
52+
DevHelper.setDebugMode(enabled: AppPreferences.devModeEnabled && AppPreferences.remoteDebuggingEnabled)
5353

5454
showSplashScreen()
5555

0 commit comments

Comments
 (0)