70 lines
2.0 KiB
Swift
70 lines
2.0 KiB
Swift
// Copyright 2015-present 650 Industries. All rights reserved.
|
|
|
|
import Foundation
|
|
|
|
@objc
|
|
public class EXDevLauncherRedBoxInterceptor: NSObject {
|
|
@objc static let customRedBox = EXDevLauncherRedBox()
|
|
|
|
@objc
|
|
public static var isInstalled: Bool = false {
|
|
willSet {
|
|
if isInstalled != newValue {
|
|
swizzle()
|
|
}
|
|
}
|
|
}
|
|
|
|
static private func swizzle() {
|
|
EXDevLauncherUtils.swizzle(
|
|
selector: #selector(RCTCxxBridge.module(forName:)),
|
|
withSelector: #selector(RCTCxxBridge.EXDevLauncher_module(forName:)),
|
|
forClass: RCTCxxBridge.self
|
|
)
|
|
|
|
EXDevLauncherUtils.swizzle(
|
|
selector: #selector(RCTCxxBridge.module(forName:lazilyLoadIfNecessary:)),
|
|
withSelector: #selector(RCTCxxBridge.EXDevLauncher_module(forName:lazilyLoadIfNecessary:)),
|
|
forClass: RCTCxxBridge.self
|
|
)
|
|
|
|
EXDevLauncherUtils.swizzle(
|
|
selector: #selector(RCTCxxBridge.module(for:)),
|
|
withSelector: #selector(RCTCxxBridge.EXDevLauncher_module(forClass:)),
|
|
forClass: RCTCxxBridge.self
|
|
)
|
|
}
|
|
}
|
|
|
|
extension RCTCxxBridge {
|
|
@objc
|
|
func EXDevLauncher_module(forName name: String) -> Any? {
|
|
let orginalModule = self.EXDevLauncher_module(forName: name)
|
|
return replaceRedBox(orginalModule)
|
|
}
|
|
|
|
@objc
|
|
func EXDevLauncher_module(forName name: String, lazilyLoadIfNecessary lazilyLoad: Bool) -> Any? {
|
|
let orginalModule = self.EXDevLauncher_module(forName: name, lazilyLoadIfNecessary: lazilyLoad)
|
|
return replaceRedBox(orginalModule)
|
|
}
|
|
|
|
@objc
|
|
func EXDevLauncher_module(forClass clazz: Any) -> Any? {
|
|
let orginalModule = self.EXDevLauncher_module(forClass: clazz)
|
|
return replaceRedBox(orginalModule)
|
|
}
|
|
|
|
@objc
|
|
private func replaceRedBox(_ module: Any?) -> Any? {
|
|
if module is RCTRedBox {
|
|
let logBox = EXDevLauncher_module(forClass: RCTLogBox.self) as? RCTLogBox
|
|
let customRedBox = EXDevLauncherRedBoxInterceptor.customRedBox
|
|
customRedBox.register(logBox)
|
|
return customRedBox.unsafe_castToRCTRedBox()
|
|
}
|
|
|
|
return module
|
|
}
|
|
}
|