2424
2525#import " SAReactNativeCategory.h"
2626#import < objc/runtime.h>
27+ #import " SAReactNativeSwizzler.h"
28+ #import " SAReactNativeRootViewManager.h"
2729
2830static void *const kSensorsAnalyticsRNScreenPropertiesKey = (void *)&kSensorsAnalyticsRNScreenPropertiesKey ;
2931static void *const kSensorsAnalyticsRNViewPropertiesKey = (void *)&kSensorsAnalyticsRNViewPropertiesKey ;
@@ -49,23 +51,46 @@ - (void)setSa_reactnative_screenProperties:(NSDictionary *)sa_reactnative_screen
4951
5052@end
5153
52- #pragma mark - UIViewController Category
53- @implementation UIViewController (SAReactNative)
54+ @implementation RCTRootView (SAReactNative)
5455
55- - (NSDictionary *)sa_reactnative_screenProperties {
56- return objc_getAssociatedObject (self, kSensorsAnalyticsRNScreenPropertiesKey );
57- }
56+ + (void )load {
57+ static dispatch_once_t onceToken;
58+ dispatch_once (&onceToken, ^{
59+ // React Native 0.66.0 及以后版本的 RCTRootView 指定构造器方法
60+ SEL originalSEL = NSSelectorFromString (@" initWithFrame:bridge:moduleName:initialProperties:" );
61+ SEL swizzleSEL = @selector (sa_reactnative_initWithFrame:bridge:moduleName:initialProperties: );
5862
59- - (void )setSa_reactnative_screenProperties : (NSDictionary *)sa_reactnative_screenProperties {
60- objc_setAssociatedObject (self, kSensorsAnalyticsRNScreenPropertiesKey , sa_reactnative_screenProperties, OBJC_ASSOCIATION_COPY_NONATOMIC );
63+ if (![RCTRootView instancesRespondToSelector: originalSEL]) {
64+ // React Native 0.66.0 以前版本的 RCTRootView 指定构造器方法
65+ originalSEL = @selector (initWithBridge:moduleName:initialProperties: );
66+ swizzleSEL = @selector (sa_reactnative_initWithBridge:moduleName:initialProperties: );
67+ }
68+
69+ [RCTRootView sa_reactnative_swizzle: originalSEL withSelector: swizzleSEL];
70+ });
6171}
6272
63- - (NSSet <SAReactNativeViewProperty *> *)sa_reactnative_viewProperties {
64- return objc_getAssociatedObject (self, kSensorsAnalyticsRNViewPropertiesKey );
73+ - (instancetype )sa_reactnative_initWithBridge : (RCTBridge *)bridge
74+ moduleName : (NSString *)moduleName
75+ initialProperties : (NSDictionary *)initialProperties {
76+ RCTRootView *rootView = [self sa_reactnative_initWithBridge: bridge
77+ moduleName: moduleName
78+ initialProperties: initialProperties];
79+ [SAReactNativeRootViewManager.sharedInstance addRootView: rootView];
80+ return rootView;
6581}
6682
67- - (void )setSa_reactnative_viewProperties : (NSSet <SAReactNativeViewProperty *> *)sa_reactnative_viewProperties {
68- objc_setAssociatedObject (self, kSensorsAnalyticsRNViewPropertiesKey , sa_reactnative_viewProperties, OBJC_ASSOCIATION_COPY_NONATOMIC );
83+
84+ - (instancetype )sa_reactnative_initWithFrame : (CGRect)frame
85+ bridge : (RCTBridge *)bridge
86+ moduleName : (NSString *)moduleName
87+ initialProperties : (nullable NSDictionary *)initialProperties {
88+ RCTRootView *rootView = [self sa_reactnative_initWithFrame: frame
89+ bridge: bridge
90+ moduleName: moduleName
91+ initialProperties: initialProperties];
92+ [SAReactNativeRootViewManager.sharedInstance addRootView: rootView];
93+ return rootView;
6994}
7095
7196@end
0 commit comments