Skip to content

Commit 4966d59

Browse files
authored
chore(iOS): add RNS_IPHONE_OS_VERSION_AVAILABLE macro (#3171)
## Description Adds `RNS_IPHONE_OS_VERSION_AVAILABLE` macro in order to simplify SDK checks in native iOS code. ### Before ```obj-c #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_26_0) && \ __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_26_0 // ... #endif ``` ### After ```obj-c #if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0) // ... #endif ``` Closes software-mansion/react-native-screens-labs#286. ## Changes - add `RNS_IPHONE_OS_VERSION_AVAILABLE` macro - replace old SDK checks with new macro - remove outdated SDK checks (iOS 14, iOS 15; min target is 15.1) ## Test code and steps to reproduce Example apps should build on both architectures. ## Checklist - [x] Included code example that can be used to test this change - [ ] Updated TS types - [ ] Updated documentation: <!-- For adding new props to native-stack --> - [ ] https://github.com/software-mansion/react-native-screens/blob/main/guides/GUIDE_FOR_LIBRARY_AUTHORS.md - [ ] https://github.com/software-mansion/react-native-screens/blob/main/native-stack/README.md - [ ] https://github.com/software-mansion/react-native-screens/blob/main/src/types.tsx - [ ] https://github.com/software-mansion/react-native-screens/blob/main/src/native-stack/types.tsx - [ ] Ensured that CI passes
1 parent 7c6d921 commit 4966d59

14 files changed

Lines changed: 39 additions & 56 deletions

ios/RNSScreen.mm

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -255,8 +255,7 @@ - (void)setStackPresentation:(RNSScreenStackPresentation)stackPresentation
255255
switch (stackPresentation) {
256256
case RNSScreenStackPresentationModal:
257257
_controller.modalPresentationStyle = UIModalPresentationAutomatic;
258-
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_17_0) && \
259-
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_17_0 && !TARGET_OS_TV
258+
#if RNS_IPHONE_OS_VERSION_AVAILABLE(17_0) && !TARGET_OS_TV
260259
if (@available(iOS 18.0, *)) {
261260
UISheetPresentationController *sheetController = _controller.sheetPresentationController;
262261
if (sheetController != nil) {
@@ -266,7 +265,7 @@ - (void)setStackPresentation:(RNSScreenStackPresentation)stackPresentation
266265
@"[RNScreens] sheetPresentationController is null when attempting to set prefersPageSizing for modal");
267266
}
268267
}
269-
#endif
268+
#endif // RNS_IPHONE_OS_VERSION_AVAILABLE(17_0) && !TARGET_OS_TV
270269
break;
271270

272271
case RNSScreenStackPresentationPageSheet:
@@ -457,8 +456,7 @@ - (void)contentWrapper:(RNSScreenContentWrapper *)contentWrapper receivedReactFr
457456
return;
458457
}
459458

460-
#if !TARGET_OS_TV && !TARGET_OS_VISION && defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
461-
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0
459+
#if !TARGET_OS_TV && !TARGET_OS_VISION && RNS_IPHONE_OS_VERSION_AVAILABLE(16_0)
462460
if (@available(iOS 16.0, *)) {
463461
UISheetPresentationController *sheetController = _controller.sheetPresentationController;
464462
if (sheetController == nil) {
@@ -473,7 +471,7 @@ - (void)contentWrapper:(RNSScreenContentWrapper *)contentWrapper receivedReactFr
473471
[self setAllowedDetentsForSheet:sheetController to:detents animate:YES];
474472
}
475473
}
476-
#endif // Check for iOS >= 16 && !TARGET_OS_TV
474+
#endif // Check for iOS >= 16 && !TARGET_OS_TV && !TARGET_OS_VISION
477475
}
478476

479477
- (void)addSubview:(UIView *)view
@@ -924,14 +922,11 @@ - (void)setLargestUndimmedDetentForSheet:(UISheetPresentationController *)sheet
924922
}
925923
}
926924

927-
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_15_0) && \
928-
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_15_0
929925
- (NSInteger)detentIndexFromDetentIdentifier:(UISheetPresentationControllerDetentIdentifier)identifier
930926
API_AVAILABLE(ios(15.0))
931927
{
932928
// We first check if we are running on iOS 16+ as the API is different
933-
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
934-
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0
929+
#if RNS_IPHONE_OS_VERSION_AVAILABLE(16_0)
935930
if (_sheetAllowedDetents.count > 0) {
936931
// We should be running on custom detents in this case, thus identifier should be a stringified number.
937932
return identifier.integerValue;
@@ -961,7 +956,6 @@ - (void)sheetPresentationControllerDidChangeSelectedDetentIdentifier:
961956
UISheetPresentationControllerDetentIdentifier ident = sheetPresentationController.selectedDetentIdentifier;
962957
[self notifySheetDetentChangeToIndex:[self detentIndexFromDetentIdentifier:ident] isStable:YES];
963958
}
964-
#endif // iOS 15 check
965959

966960
/**
967961
* Updates settings for sheet presentation controller.
@@ -975,8 +969,6 @@ - (void)updateFormSheetPresentationStyle
975969
return;
976970
}
977971

978-
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_15_0) && \
979-
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_15_0
980972
int firstDimmedDetentIndex = _sheetAllowedDetents.count;
981973

982974
// Whether we use system (iOS 15) detents or custom (iOS 16+).
@@ -990,8 +982,7 @@ - (void)updateFormSheetPresentationStyle
990982
return;
991983
}
992984
sheet.delegate = self;
993-
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
994-
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0
985+
#if RNS_IPHONE_OS_VERSION_AVAILABLE(16_0)
995986
if (@available(iOS 16.0, *)) {
996987
if (_sheetAllowedDetents.count > 0) {
997988
if (_sheetAllowedDetents.count == 1 && [_sheetAllowedDetents[0] integerValue] == SHEET_FIT_TO_CONTENTS) {
@@ -1052,8 +1043,7 @@ - (void)updateFormSheetPresentationStyle
10521043
// Handle initial detent on the first update.
10531044
if (!_sheetHasInitialDetentSet) {
10541045
if (_sheetInitialDetent > 0 && _sheetInitialDetent < _sheetAllowedDetents.count) {
1055-
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
1056-
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0
1046+
#if RNS_IPHONE_OS_VERSION_AVAILABLE(16_0)
10571047
if (@available(iOS 16.0, *)) {
10581048
UISheetPresentationControllerDetent *detent = sheet.detents[_sheetInitialDetent];
10591049
[self setSelectedDetentForSheet:sheet to:detent.identifier animate:YES];
@@ -1111,11 +1101,9 @@ - (void)updateFormSheetPresentationStyle
11111101
// out.
11121102
[self->_contentWrapperBox.contentWrapper triggerDelegateUpdate];
11131103
#endif // RCT_NEW_ARCH_ENABLED
1114-
#endif // Check for iOS >= 15
11151104
}
11161105

1117-
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
1118-
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0
1106+
#if RNS_IPHONE_OS_VERSION_AVAILABLE(16_0)
11191107

11201108
/**
11211109
* Creates array of detent objects based on provided `values` & `resolver`. Since we need to name the detents to be able

ios/RNSScreenStack.mm

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,7 @@ @interface RNSScreenStackView () <
6262

6363
@implementation RNSNavigationController
6464

65-
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_26_0) && \
66-
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_26_0
65+
#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
6766
- (void)viewDidLoad
6867
{
6968
// iOS 26 introduces new gesture recognizer which replaces our RNSPanGestureRecognizer.
@@ -222,8 +221,7 @@ - (bool)onRepeatedTabSelectionOfTabScreenController:(RNSTabsScreenViewController
222221

223222
#pragma mark - UINavigationBarDelegate
224223

225-
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_26_0) && \
226-
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_26_0
224+
#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
227225
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
228226
{
229227
if (@available(iOS 26, *)) {

ios/RNSScreenStackHeaderConfig.mm

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -705,14 +705,12 @@ + (void)updateViewController:(UIViewController *)vc
705705
searchBarPresent = true;
706706
navitem.searchController = searchBar.controller;
707707
navitem.hidesSearchBarWhenScrolling = searchBar.hideWhenScrolling;
708-
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
709-
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0
708+
#if RNS_IPHONE_OS_VERSION_AVAILABLE(16_0)
710709
if (@available(iOS 16.0, *)) {
711710
navitem.preferredSearchBarPlacement = [searchBar placementAsUINavigationItemSearchBarPlacement];
712711
}
713712
#endif /* Check for iOS 16.0 */
714-
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_26_0) && \
715-
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_26_0
713+
#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
716714
if (@available(iOS 26.0, *)) {
717715
// Workaround for missing search bar on root stack screen.
718716
// See: https://github.com/software-mansion/react-native-screens/pull/3098

ios/RNSScreenWindowTraits.mm

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,7 @@ + (void)enforceDesiredDeviceOrientation
128128
}
129129
}
130130
if (newOrientation != UIInterfaceOrientationUnknown) {
131-
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
132-
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0
131+
#if RNS_IPHONE_OS_VERSION_AVAILABLE(16_0)
133132
if (@available(iOS 16.0, *)) {
134133
NSArray *array = [[[UIApplication sharedApplication] connectedScenes] allObjects];
135134

ios/RNSSearchBar.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#import <React/RCTBridge.h>
99
#import <React/RCTComponent.h>
1010
#import <React/RCTViewManager.h>
11+
#import "RNSDefines.h"
1112
#import "RNSEnums.h"
1213

1314
@interface RNSSearchBar :
@@ -21,8 +22,7 @@
2122
@property (nonatomic) RNSSearchBarPlacement placement;
2223
@property (nonatomic, retain) UISearchController *controller;
2324

24-
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
25-
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0 && !TARGET_OS_TV
25+
#if RNS_IPHONE_OS_VERSION_AVAILABLE(16_0) && !TARGET_OS_TV
2626
- (UINavigationItemSearchBarPlacement)placementAsUINavigationItemSearchBarPlacement API_AVAILABLE(ios(16.0))
2727
API_UNAVAILABLE(tvos, watchos);
2828
#endif // Check for iOS >= 16 && !TARGET_OS_TV

ios/RNSSearchBar.mm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#import <UIKit/UIKit.h>
22

3+
#import "RNSDefines.h"
34
#import "RNSSearchBar.h"
45

56
#import <React/RCTBridge.h>
@@ -220,8 +221,7 @@ - (void)showCancelButton
220221
#endif
221222
}
222223

223-
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_16_0) && \
224-
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_16_0 && !TARGET_OS_TV
224+
#if RNS_IPHONE_OS_VERSION_AVAILABLE(16_0) && !TARGET_OS_TV
225225
- (UINavigationItemSearchBarPlacement)placementAsUINavigationItemSearchBarPlacement API_AVAILABLE(ios(16.0))
226226
API_UNAVAILABLE(tvos, watchos)
227227
{

ios/bottom-tabs/RNSBottomTabsHostComponentView.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#import "RNSBottomTabsHostComponentViewManager.h"
22
#import "RNSBottomTabsHostEventEmitter.h"
3+
#import "RNSDefines.h"
34
#import "RNSEnums.h"
45
#import "RNSReactBaseView.h"
56
#import "RNSScreenContainer.h"
@@ -49,8 +50,7 @@ NS_ASSUME_NONNULL_BEGIN
4950

5051
@property (nonatomic, readonly) BOOL experimental_controlNavigationStateInJS;
5152

52-
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_26_0) && \
53-
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_26_0
53+
#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
5454
@property (nonatomic, readonly) UITabBarMinimizeBehavior tabBarMinimizeBehavior API_AVAILABLE(ios(26.0));
5555
#endif // Check for iOS >= 26
5656

ios/bottom-tabs/RNSBottomTabsHostComponentView.mm

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -254,8 +254,7 @@ - (void)updateProps:(const facebook::react::Props::Shared &)props
254254
}
255255

256256
if (newComponentProps.tabBarMinimizeBehavior != oldComponentProps.tabBarMinimizeBehavior) {
257-
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_26_0) && \
258-
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_26_0
257+
#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
259258
if (@available(iOS 26.0, *)) {
260259
_tabBarMinimizeBehavior = rnscreens::conversion::UITabBarMinimizeBehaviorFromRNSBottomTabsTabBarMinimizeBehavior(
261260
newComponentProps.tabBarMinimizeBehavior);
@@ -421,8 +420,7 @@ - (void)setTabBarTintColor:(UIColor *_Nullable)tabBarTintColor
421420
// It allows us to store UITabBarMinimizeBehavior in the component while accepting a custom enum as input from JS.
422421
- (void)setTabBarMinimizeBehaviorFromRNSTabBarMinimizeBehavior:(RNSTabBarMinimizeBehavior)tabBarMinimizeBehavior
423422
{
424-
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_26_0) && \
425-
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_26_0
423+
#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
426424
if (@available(iOS 26.0, *)) {
427425
_tabBarMinimizeBehavior =
428426
rnscreens::conversion::UITabBarMinimizeBehaviorFromRNSTabBarMinimizeBehavior(tabBarMinimizeBehavior);

ios/conversion/RNSConversions-BottomTabs.mm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#import <React/RCTConversions.h>
22
#import <react/renderer/imagemanager/RCTImagePrimitivesConversions.h>
33
#import "RNSConversions.h"
4+
#import "RNSDefines.h"
45

56
namespace rnscreens::conversion {
67

@@ -137,8 +138,7 @@
137138
return RNSUIBlurEffectFromOptionalUIBlurEffectStyle(maybeStyle);
138139
}
139140

140-
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_26_0) && \
141-
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_26_0
141+
#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
142142

143143
#if RCT_NEW_ARCH_ENABLED
144144
API_AVAILABLE(ios(26.0))

ios/conversion/RNSConversions.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#if defined(__cplusplus)
44
#import <React/RCTImageSource.h>
55
#import <react/renderer/components/rnscreens/Props.h>
6+
#import "RNSDefines.h"
67
#import "RNSEnums.h"
78

89
#if RCT_NEW_ARCH_ENABLED
@@ -28,8 +29,7 @@ std::optional<UIBlurEffectStyle> RNSMaybeUIBlurEffectStyleFromRNSBlurEffectStyle
2829

2930
UIBlurEffect *RNSUIBlurEffectFromRNSBlurEffectStyle(RNSBlurEffectStyle blurEffect);
3031

31-
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_26_0) && \
32-
__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_26_0
32+
#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
3333

3434
#if RCT_NEW_ARCH_ENABLED
3535
API_AVAILABLE(ios(26.0))

0 commit comments

Comments
 (0)