From 1dd647484aff00a079923a5c0e763e3f54ccc210 Mon Sep 17 00:00:00 2001 From: Saad Najmi Date: Tue, 16 Jan 2024 07:50:27 -0800 Subject: [PATCH] Remove TARGET_OS_UIKITFORMAC macros (#42278) Summary: There seems to be a lot of `TARGET_OS_UIKITFORMAC` macro in React Native that don't need to be there. Let's remove them. First off, what is `TARGET_OS_UIKITFORMAC` targeting? You might think it's [Mac Catalyst](https://developer.apple.com/mac-catalyst/), if you look at the [commit](https://github.com/facebook/react-native/commit/3724810d2168eb182db24acf9e741775df27ae13) introducing the ifdefs. However.. that doesn't seem right because `TARGET_OS_MACCATALYST` exists, and is used elsewhere in the codebase. In fact, if you look at this handy comment inside `TargetConditionals.h` (the file that defines all these conditionals), `TARGET_OS_UIKITFORMAC` is not even on there! ``` /* * TARGET_OS_* * * These conditionals specify in which Operating System the generated code will * run. Indention is used to show which conditionals are evolutionary subclasses. * * The MAC/WIN32/UNIX conditionals are mutually exclusive. * The IOS/TV/WATCH/VISION conditionals are mutually exclusive. * * TARGET_OS_WIN32 - Generated code will run on WIN32 API * TARGET_OS_WINDOWS - Generated code will run on Windows * TARGET_OS_UNIX - Generated code will run on some Unix (not macOS) * TARGET_OS_LINUX - Generated code will run on Linux * TARGET_OS_MAC - Generated code will run on a variant of macOS * TARGET_OS_OSX - Generated code will run on macOS * TARGET_OS_IPHONE - Generated code will run on a variant of iOS (firmware, devices, simulator) * TARGET_OS_IOS - Generated code will run on iOS * TARGET_OS_MACCATALYST - Generated code will run on macOS * TARGET_OS_TV - Generated code will run on tvOS * TARGET_OS_WATCH - Generated code will run on watchOS * TARGET_OS_VISION - Generated code will run on visionOS * TARGET_OS_BRIDGE - Generated code will run on bridge devices * TARGET_OS_SIMULATOR - Generated code will run on an iOS, tvOS, watchOS, or visionOS simulator * TARGET_OS_DRIVERKIT - Generated code will run on macOS, iOS, tvOS, watchOS, or visionOS * * TARGET_OS_EMBEDDED - DEPRECATED: Use TARGET_OS_IPHONE and/or TARGET_OS_SIMULATOR instead * TARGET_IPHONE_SIMULATOR - DEPRECATED: Same as TARGET_OS_SIMULATOR * TARGET_OS_NANO - DEPRECATED: Same as TARGET_OS_WATCH * * +--------------------------------------------------------------------------------------+ * | TARGET_OS_MAC | * | +-----+ +------------------------------------------------------------+ +-----------+ | * | | | | TARGET_OS_IPHONE | | | | * | | | | +-----------------+ +----+ +-------+ +--------+ +--------+ | | | | * | | | | | IOS | | | | | | | | | | | | | * | | OSX | | | +-------------+ | | TV | | WATCH | | BRIDGE | | VISION | | | DRIVERKIT | | * | | | | | | MACCATALYST | | | | | | | | | | | | | | * | | | | | +-------------+ | | | | | | | | | | | | | * | | | | +-----------------+ +----+ +-------+ +--------+ +--------+ | | | | * | +-----+ +------------------------------------------------------------+ +-----------+ | * +--------------------------------------------------------------------------------------+ */ ``` Going even deeper into `TargetConditionals.h`, you will see `TARGET_OS_UIKITFORMAC` defined... and it's always 1 when `TARGET_OS_MACCATALYST` is 1, making it feel even more redundant. My current conclusion is it's either another variant of Mac Catalyst (the one where they just run unmodified UIKit maybe..), or it's an older macro back from when Catalyst was still experimental. Either way, it's pretty obvious nobody is running or testing this codepath, and it adds bloat, especially to React Native macOS where we have extra ifdef blocks for macOS support (and eventually visionOS support). Let's remove it. Another change I made while we're here: I've seen this lingering TODO to replace setTargetRect:InView: / setMenuVisible:animated: (deprecated as of iOS 13, below our minimum OS requirement) with showMenuFromView (deprecated as of iOS 16, in line with the availability check). Let's just.... do that? ## Changelog: [IOS] [REMOVED] - Remove TARGET_OS_UIKITFORMAC macros Pull Request resolved: https://github.com/facebook/react-native/pull/42278 Test Plan: RNTester with Mac Catalyst still compiles: ![Screenshot 2024-01-15 at 12 26 03 AM](https://github.com/facebook/react-native/assets/6722175/015bd37d-f536-43c7-9586-96187cdbd013) Reviewed By: cipolleschi Differential Revision: D52780690 Pulled By: sammy-SC fbshipit-source-id: df6a333e8e15f79de0ce6f538ebd73b92698dcb6 --- .../Libraries/Image/RCTUIImageViewAnimated.mm | 5 - .../RCTPushNotificationManager.h | 2 - .../RCTPushNotificationManager.mm | 105 ------------------ .../Libraries/Text/Text/RCTTextView.mm | 8 +- .../Text/RCTParagraphComponentView.mm | 6 +- packages/rn-tester/RNTester/AppDelegate.mm | 6 - 6 files changed, 3 insertions(+), 129 deletions(-) diff --git a/packages/react-native/Libraries/Image/RCTUIImageViewAnimated.mm b/packages/react-native/Libraries/Image/RCTUIImageViewAnimated.mm index aa0abfe6489..b2247c58d05 100644 --- a/packages/react-native/Libraries/Image/RCTUIImageViewAnimated.mm +++ b/packages/react-native/Libraries/Image/RCTUIImageViewAnimated.mm @@ -186,15 +186,10 @@ static NSUInteger RCTDeviceFreeMemory(void) - (void)displayDidRefresh:(CADisplayLink *)displayLink { -#if TARGET_OS_UIKITFORMAC - // TODO: `displayLink.frameInterval` is not available on UIKitForMac - NSTimeInterval durationToNextRefresh = displayLink.duration; -#else // displaylink.duration -- time interval between frames, assuming maximumFramesPerSecond // displayLink.preferredFramesPerSecond (>= iOS 10) -- Set to 30 for displayDidRefresh to be called at 30 fps // durationToNextRefresh -- Time interval to the next time displayDidRefresh is called NSTimeInterval durationToNextRefresh = displayLink.targetTimestamp - displayLink.timestamp; -#endif NSUInteger totalFrameCount = self.totalFrameCount; NSUInteger currentFrameIndex = self.currentFrameIndex; NSUInteger nextFrameIndex = (currentFrameIndex + 1) % totalFrameCount; diff --git a/packages/react-native/Libraries/PushNotificationIOS/RCTPushNotificationManager.h b/packages/react-native/Libraries/PushNotificationIOS/RCTPushNotificationManager.h index e49f6ed9d54..546b78021c1 100644 --- a/packages/react-native/Libraries/PushNotificationIOS/RCTPushNotificationManager.h +++ b/packages/react-native/Libraries/PushNotificationIOS/RCTPushNotificationManager.h @@ -13,13 +13,11 @@ extern NSString *const RCTRemoteNotificationReceived; typedef void (^RCTRemoteNotificationCallback)(UIBackgroundFetchResult result); -#if !TARGET_OS_UIKITFORMAC + (void)didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken; + (void)didReceiveRemoteNotification:(NSDictionary *)notification; + (void)didReceiveRemoteNotification:(NSDictionary *)notification fetchCompletionHandler:(RCTRemoteNotificationCallback)completionHandler; + (void)didReceiveLocalNotification:(UILocalNotification *)notification; + (void)didFailToRegisterForRemoteNotificationsWithError:(NSError *)error; -#endif @end diff --git a/packages/react-native/Libraries/PushNotificationIOS/RCTPushNotificationManager.mm b/packages/react-native/Libraries/PushNotificationIOS/RCTPushNotificationManager.mm index d0c38c91e5a..ef526ab958b 100644 --- a/packages/react-native/Libraries/PushNotificationIOS/RCTPushNotificationManager.mm +++ b/packages/react-native/Libraries/PushNotificationIOS/RCTPushNotificationManager.mm @@ -24,8 +24,6 @@ static NSString *const kRemoteNotificationRegistrationFailed = @"RemoteNotificat static NSString *const kErrorUnableToRequestPermissions = @"E_UNABLE_TO_REQUEST_PERMISSIONS"; -#if !TARGET_OS_UIKITFORMAC - @interface RCTPushNotificationManager () @property (nonatomic, strong) NSMutableDictionary *remoteNotificationCallbacks; @end @@ -95,15 +93,9 @@ RCT_ENUM_CONVERTER( integerValue) @end -#else -@interface RCTPushNotificationManager () -@end -#endif // TARGET_OS_UIKITFORMAC @implementation RCTPushNotificationManager -#if !TARGET_OS_UIKITFORMAC - /** DEPRECATED. UILocalNotification was deprecated in iOS 10. Please don't add new callsites. */ static NSDictionary *RCTFormatLocalNotification(UILocalNotification *notification) { @@ -176,8 +168,6 @@ static NSString *RCTFormatNotificationDateFromNSDate(NSDate *date) return [formatter stringFromDate:date]; } -#endif // TARGET_OS_UIKITFORMAC - RCT_EXPORT_MODULE() - (dispatch_queue_t)methodQueue @@ -185,7 +175,6 @@ RCT_EXPORT_MODULE() return dispatch_get_main_queue(); } -#if !TARGET_OS_UIKITFORMAC - (void)startObserving { [[NSNotificationCenter defaultCenter] addObserver:self @@ -577,100 +566,6 @@ RCT_EXPORT_METHOD(getAuthorizationStatus : (RCTResponseSenderBlock)callback) }]; } -#else // TARGET_OS_UIKITFORMAC - -RCT_EXPORT_METHOD(onFinishRemoteNotification : (NSString *)notificationId fetchResult : (NSString *)fetchResult) -{ - RCTLogError(@"Not implemented: %@", NSStringFromSelector(_cmd)); -} - -RCT_EXPORT_METHOD(setApplicationIconBadgeNumber : (double)number) -{ - RCTLogError(@"Not implemented: %@", NSStringFromSelector(_cmd)); -} - -RCT_EXPORT_METHOD(getApplicationIconBadgeNumber : (RCTResponseSenderBlock)callback) -{ - RCTLogError(@"Not implemented: %@", NSStringFromSelector(_cmd)); -} - -RCT_EXPORT_METHOD(requestPermissions - : (JS::NativePushNotificationManagerIOS::SpecRequestPermissionsPermission &)permissions resolve - : (RCTPromiseResolveBlock)resolve reject - : (RCTPromiseRejectBlock)reject) -{ - RCTLogError(@"Not implemented: %@", NSStringFromSelector(_cmd)); -} - -RCT_EXPORT_METHOD(abandonPermissions) -{ - RCTLogError(@"Not implemented: %@", NSStringFromSelector(_cmd)); -} - -RCT_EXPORT_METHOD(checkPermissions : (RCTResponseSenderBlock)callback) -{ - RCTLogError(@"Not implemented: %@", NSStringFromSelector(_cmd)); -} - -RCT_EXPORT_METHOD(presentLocalNotification : (JS::NativePushNotificationManagerIOS::Notification &)notification) -{ - RCTLogError(@"Not implemented: %@", NSStringFromSelector(_cmd)); -} - -RCT_EXPORT_METHOD(scheduleLocalNotification : (JS::NativePushNotificationManagerIOS::Notification &)notification) -{ - RCTLogError(@"Not implemented: %@", NSStringFromSelector(_cmd)); -} - -RCT_EXPORT_METHOD(cancelAllLocalNotifications) -{ - RCTLogError(@"Not implemented: %@", NSStringFromSelector(_cmd)); -} - -RCT_EXPORT_METHOD(cancelLocalNotifications : (NSDictionary *)userInfo) -{ - RCTLogError(@"Not implemented: %@", NSStringFromSelector(_cmd)); -} - -RCT_EXPORT_METHOD(getInitialNotification - : (RCTPromiseResolveBlock)resolve reject - : (__unused RCTPromiseRejectBlock)reject) -{ - RCTLogError(@"Not implemented: %@", NSStringFromSelector(_cmd)); -} - -RCT_EXPORT_METHOD(getScheduledLocalNotifications : (RCTResponseSenderBlock)callback) -{ - RCTLogError(@"Not implemented: %@", NSStringFromSelector(_cmd)); -} - -RCT_EXPORT_METHOD(removeAllDeliveredNotifications) -{ - RCTLogError(@"Not implemented: %@", NSStringFromSelector(_cmd)); -} - -RCT_EXPORT_METHOD(removeDeliveredNotifications : (NSArray *)identifiers) -{ - RCTLogError(@"Not implemented: %@", NSStringFromSelector(_cmd)); -} - -RCT_EXPORT_METHOD(getDeliveredNotifications : (RCTResponseSenderBlock)callback) -{ - RCTLogError(@"Not implemented: %@", NSStringFromSelector(_cmd)); -} - -RCT_EXPORT_METHOD(getAuthorizationStatus : (RCTResponseSenderBlock)callback) -{ - RCTLogError(@"Not implemented: %@", NSStringFromSelector(_cmd)); -} - -- (NSArray *)supportedEvents -{ - return @[]; -} - -#endif // TARGET_OS_UIKITFORMAC - - (std::shared_ptr)getTurboModule: (const facebook::react::ObjCTurboModule::InitParams &)params { diff --git a/packages/react-native/Libraries/Text/Text/RCTTextView.mm b/packages/react-native/Libraries/Text/Text/RCTTextView.mm index bcfb5003ee9..1daefe42051 100644 --- a/packages/react-native/Libraries/Text/Text/RCTTextView.mm +++ b/packages/react-native/Libraries/Text/Text/RCTTextView.mm @@ -240,8 +240,7 @@ - (void)handleLongPress:(UILongPressGestureRecognizer *)gesture { -#if !TARGET_OS_UIKITFORMAC - if (@available(iOS 16.0, *)) { + if (@available(iOS 16.0, macCatalyst 16.0, *)) { CGPoint location = [gesture locationInView:self]; UIEditMenuConfiguration *config = [UIEditMenuConfiguration configurationWithIdentifier:nil sourcePoint:location]; if (_editMenuInteraction) { @@ -249,7 +248,6 @@ } return; } - // TODO: Adopt showMenuFromRect (necessary for UIKitForMac) UIMenuController *menuController = [UIMenuController sharedMenuController]; if (menuController.isMenuVisible) { @@ -260,9 +258,7 @@ [self becomeFirstResponder]; } - [menuController setTargetRect:self.bounds inView:self]; - [menuController setMenuVisible:YES animated:YES]; -#endif + [menuController showMenuFromView:self rect:self.bounds]; } - (BOOL)canBecomeFirstResponder diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentView.mm index 0787ef71caf..b62b83040a4 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentView.mm @@ -236,7 +236,6 @@ using namespace facebook::react; - (void)handleLongPress:(UILongPressGestureRecognizer *)gesture { -#if !TARGET_OS_UIKITFORMAC if (@available(iOS 16.0, *)) { CGPoint location = [gesture locationInView:self]; UIEditMenuConfiguration *config = [UIEditMenuConfiguration configurationWithIdentifier:nil sourcePoint:location]; @@ -245,7 +244,6 @@ using namespace facebook::react; } return; } - // TODO: Adopt showMenuFromRect (necessary for UIKitForMac) UIMenuController *menuController = [UIMenuController sharedMenuController]; if (menuController.isMenuVisible) { @@ -256,9 +254,7 @@ using namespace facebook::react; [self becomeFirstResponder]; } - [menuController setTargetRect:self.bounds inView:self]; - [menuController setMenuVisible:YES animated:YES]; -#endif + [menuController showMenuFromView:self rect:self.bounds]; } - (BOOL)canBecomeFirstResponder diff --git a/packages/rn-tester/RNTester/AppDelegate.mm b/packages/rn-tester/RNTester/AppDelegate.mm index 26168a3e495..ddda5db3aa5 100644 --- a/packages/rn-tester/RNTester/AppDelegate.mm +++ b/packages/rn-tester/RNTester/AppDelegate.mm @@ -13,9 +13,7 @@ #import #import -#if !TARGET_OS_TV && !TARGET_OS_UIKITFORMAC #import -#endif #import #ifndef RN_DISABLE_OSS_PLUGIN_HEADER @@ -84,8 +82,6 @@ static NSString *kBundlePath = @"js/RNTesterApp.ios"; return nullptr; } -#if !TARGET_OS_TV && !TARGET_OS_UIKITFORMAC - // Required for the remoteNotificationsRegistered event. - (void)application:(__unused UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken @@ -113,8 +109,6 @@ static NSString *kBundlePath = @"js/RNTesterApp.ios"; [RCTPushNotificationManager didReceiveLocalNotification:notification]; } -#endif - #pragma mark - New Arch Enabled settings - (BOOL)bridgelessEnabled