Skip to content

Commit ac0eb65

Browse files
authored
Improve tvOS compat (#907)
1 parent c42e2bc commit ac0eb65

20 files changed

+155
-39
lines changed

example/ios/Podfile.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1575,7 +1575,7 @@ PODS:
15751575
- React-logger (= 0.76.2)
15761576
- React-perflogger (= 0.76.2)
15771577
- React-utils (= 0.76.2)
1578-
- RNPermissions (5.1.0):
1578+
- RNPermissions (5.2.0):
15791579
- DoubleConversion
15801580
- glog
15811581
- hermes-engine
@@ -1893,7 +1893,7 @@ SPEC CHECKSUMS:
18931893
React-utils: c8c0c746031419a29cfd8c72a394fdeac0684a84
18941894
ReactCodegen: a64e8f3a8bba0ecf88fce06c2874e021d55148f3
18951895
ReactCommon: 7b9403030ff3430ccffed63cd25c8aeab2a3ea7e
1896-
RNPermissions: 669997f76d2e3552b56ae66dc1b1f8d6363fa39e
1896+
RNPermissions: 28282c8a8d486a6df4c0bcca76bf748212f5610c
18971897
RNVectorIcons: a24016b773380b1aa37fca501ec6b94a951890a0
18981898
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
18991899
Yoga: 96872ee462cfc43866ad013c8160d4ff6b85709b

example/ios/RNPermissionsExample.xcodeproj/project.pbxproj

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,10 @@
384384
"-DFOLLY_CFG_NO_COROUTINES=1",
385385
"-DFOLLY_HAVE_CLOCK_GETTIME=1",
386386
);
387-
OTHER_LDFLAGS = "$(inherited) ";
387+
OTHER_LDFLAGS = (
388+
"$(inherited)",
389+
" ",
390+
);
388391
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
389392
SDKROOT = iphoneos;
390393
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
@@ -453,7 +456,10 @@
453456
"-DFOLLY_CFG_NO_COROUTINES=1",
454457
"-DFOLLY_HAVE_CLOCK_GETTIME=1",
455458
);
456-
OTHER_LDFLAGS = "$(inherited) ";
459+
OTHER_LDFLAGS = (
460+
"$(inherited)",
461+
" ",
462+
);
457463
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
458464
SDKROOT = iphoneos;
459465
USE_HERMES = true;

ios/AppTrackingTransparency/RNPermissionHandlerAppTrackingTransparency.mm

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ - (RNPermissionStatus)convertStatus:(ATTrackingManagerAuthorizationStatus)status
3333
}
3434

3535
- (RNPermissionStatus)currentStatus {
36-
if (@available(iOS 14.0, *)) {
36+
if (@available(iOS 14.0, tvOS 14.0, *)) {
3737
return [self convertStatus:[ATTrackingManager trackingAuthorizationStatus]];
3838
} else {
3939
if ([[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) {
@@ -46,7 +46,7 @@ - (RNPermissionStatus)currentStatus {
4646

4747
- (void)requestWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
4848
rejecter:(void (^ _Nonnull)(NSError * _Nonnull))reject {
49-
if (@available(iOS 14.0, *)) {
49+
if (@available(iOS 14.0, tvOS 14.0, *)) {
5050
if ([ATTrackingManager trackingAuthorizationStatus] != ATTrackingManagerAuthorizationStatusNotDetermined) {
5151
return resolve([self currentStatus]);
5252
}
@@ -73,7 +73,7 @@ - (void)onApplicationDidBecomeActive:(__unused NSNotification *)notification {
7373
name:UIApplicationDidBecomeActiveNotification
7474
object:nil];
7575

76-
if (@available(iOS 14.0, *)) {
76+
if (@available(iOS 14.0, tvOS 14.0, *)) {
7777
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
7878
self->_resolve([self convertStatus:status]);
7979
}];

ios/Bluetooth/RNPermissionHandlerBluetooth.mm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ + (NSString * _Nonnull)handlerUniqueId {
2323
}
2424

2525
- (RNPermissionStatus)currentStatus {
26-
#if TARGET_OS_SIMULATOR
26+
#if TARGET_OS_TV || TARGET_OS_SIMULATOR
2727
return RNPermissionStatusNotAvailable;
2828
#else
2929
switch ([CBManager authorization]) {
@@ -41,7 +41,7 @@ - (RNPermissionStatus)currentStatus {
4141

4242
- (void)requestWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
4343
rejecter:(void (^ _Nonnull)(NSError * _Nonnull))reject {
44-
#if TARGET_OS_SIMULATOR
44+
#if TARGET_OS_TV || TARGET_OS_SIMULATOR
4545
return resolve(RNPermissionStatusNotAvailable);
4646
#else
4747
_resolve = resolve;

ios/Calendars/RNPermissionHandlerCalendars.mm

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#import "RNPermissionHandlerCalendars.h"
22

3+
#if !TARGET_OS_TV
34
#import <EventKit/EventKit.h>
5+
#endif
46

57
@implementation RNPermissionHandlerCalendars
68

@@ -13,6 +15,9 @@ + (NSString * _Nonnull)handlerUniqueId {
1315
}
1416

1517
- (RNPermissionStatus)currentStatus {
18+
#if TARGET_OS_TV
19+
return RNPermissionStatusNotAvailable;
20+
#else
1621
switch ([EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent]) {
1722
case EKAuthorizationStatusNotDetermined:
1823
return RNPermissionStatusNotDetermined;
@@ -25,10 +30,14 @@ - (RNPermissionStatus)currentStatus {
2530
case EKAuthorizationStatusFullAccess:
2631
return RNPermissionStatusAuthorized;
2732
}
33+
#endif
2834
}
2935

3036
- (void)requestWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
3137
rejecter:(void (^ _Nonnull)(NSError * _Nonnull))reject {
38+
#if TARGET_OS_TV
39+
resolve(RNPermissionStatusNotAvailable);
40+
#else
3241
EKEventStore *store = [EKEventStore new];
3342

3443
void (^completion)(BOOL, NSError * _Nullable) = ^(__unused BOOL granted, NSError * _Nullable error) {
@@ -56,6 +65,7 @@ - (void)requestWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
5665
} else {
5766
[store requestAccessToEntityType:EKEntityTypeEvent completion:completion];
5867
}
68+
#endif
5969
}
6070

6171
@end

ios/CalendarsWriteOnly/RNPermissionHandlerCalendarsWriteOnly.mm

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#import "RNPermissionHandlerCalendarsWriteOnly.h"
22

3+
#if !TARGET_OS_TV
34
#import <EventKit/EventKit.h>
5+
#endif
46

57
@implementation RNPermissionHandlerCalendarsWriteOnly
68

@@ -13,6 +15,9 @@ + (NSString * _Nonnull)handlerUniqueId {
1315
}
1416

1517
- (RNPermissionStatus)currentStatus {
18+
#if TARGET_OS_TV
19+
return RNPermissionStatusNotAvailable;
20+
#else
1621
switch ([EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent]) {
1722
case EKAuthorizationStatusNotDetermined:
1823
return RNPermissionStatusNotDetermined;
@@ -24,10 +29,14 @@ - (RNPermissionStatus)currentStatus {
2429
case EKAuthorizationStatusFullAccess:
2530
return RNPermissionStatusAuthorized;
2631
}
32+
#endif
2733
}
2834

2935
- (void)requestWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
3036
rejecter:(void (^ _Nonnull)(NSError * _Nonnull))reject {
37+
#if TARGET_OS_TV
38+
resolve(RNPermissionStatusNotAvailable);
39+
#else
3140
EKEventStore *store = [EKEventStore new];
3241

3342
void (^completion)(BOOL, NSError * _Nullable) = ^(__unused BOOL granted, NSError * _Nullable error) {
@@ -43,6 +52,7 @@ - (void)requestWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
4352
} else {
4453
[store requestAccessToEntityType:EKEntityTypeEvent completion:completion];
4554
}
55+
#endif
4656
}
4757

4858
@end

ios/Camera/RNPermissionHandlerCamera.mm

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,24 +13,32 @@ + (NSString * _Nonnull)handlerUniqueId {
1313
}
1414

1515
- (RNPermissionStatus)currentStatus {
16-
switch ([AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]) {
17-
case AVAuthorizationStatusNotDetermined:
18-
return RNPermissionStatusNotDetermined;
19-
case AVAuthorizationStatusRestricted:
20-
return RNPermissionStatusRestricted;
21-
case AVAuthorizationStatusDenied:
22-
return RNPermissionStatusDenied;
23-
case AVAuthorizationStatusAuthorized:
24-
return RNPermissionStatusAuthorized;
16+
if (@available(iOS 7.0, tvOS 17.0, *)) {
17+
switch ([AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]) {
18+
case AVAuthorizationStatusNotDetermined:
19+
return RNPermissionStatusNotDetermined;
20+
case AVAuthorizationStatusRestricted:
21+
return RNPermissionStatusRestricted;
22+
case AVAuthorizationStatusDenied:
23+
return RNPermissionStatusDenied;
24+
case AVAuthorizationStatusAuthorized:
25+
return RNPermissionStatusAuthorized;
26+
}
27+
} else {
28+
return RNPermissionStatusNotAvailable;
2529
}
2630
}
2731

2832
- (void)requestWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
2933
rejecter:(void (^ _Nonnull)(NSError * _Nonnull))reject {
30-
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo
31-
completionHandler:^(__unused BOOL granted) {
34+
if (@available(iOS 7.0, tvOS 17.0, *)) {
35+
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo
36+
completionHandler:^(__unused BOOL granted) {
37+
resolve([self currentStatus]);
38+
}];
39+
} else {
3240
resolve([self currentStatus]);
33-
}];
41+
}
3442
}
3543

3644
@end

ios/Contacts/RNPermissionHandlerContacts.mm

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#import "RNPermissionHandlerContacts.h"
22

3+
#if !TARGET_OS_TV
34
#import <Contacts/Contacts.h>
5+
#endif
46

57
@implementation RNPermissionHandlerContacts
68

@@ -13,6 +15,9 @@ + (NSString * _Nonnull)handlerUniqueId {
1315
}
1416

1517
- (RNPermissionStatus)currentStatus {
18+
#if TARGET_OS_TV
19+
return RNPermissionStatusNotAvailable;
20+
#else
1621
switch ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]) {
1722
case CNAuthorizationStatusNotDetermined:
1823
return RNPermissionStatusNotDetermined;
@@ -25,10 +30,14 @@ - (RNPermissionStatus)currentStatus {
2530
case CNAuthorizationStatusAuthorized:
2631
return RNPermissionStatusAuthorized;
2732
}
33+
#endif
2834
}
2935

3036
- (void)requestWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
3137
rejecter:(void (^ _Nonnull)(NSError * _Nonnull))reject {
38+
#if TARGET_OS_TV
39+
resolve(RNPermissionStatusNotAvailable);
40+
#else
3241
[[CNContactStore new] requestAccessForEntityType:CNEntityTypeContacts
3342
completionHandler:^(__unused BOOL granted, NSError * _Nullable error) {
3443
if (error != nil && error.code != 100) { // error code 100 is permission denied
@@ -37,6 +46,7 @@ - (void)requestWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
3746
resolve([self currentStatus]);
3847
}
3948
}];
49+
#endif
4050
}
4151

4252
@end

ios/FaceID/RNPermissionHandlerFaceID.mm

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44

55
@interface RNPermissionHandlerFaceID()
66

7+
#if !TARGET_OS_TV
78
@property (nonatomic, strong) LAContext *laContext;
89
@property (nonatomic, strong) void (^resolve)(RNPermissionStatus status);
10+
#endif
911

1012
@end
1113

@@ -20,6 +22,9 @@ + (NSString * _Nonnull)handlerUniqueId {
2022
}
2123

2224
- (RNPermissionStatus)currentStatus {
25+
#if TARGET_OS_TV
26+
return RNPermissionStatusNotAvailable;
27+
#else
2328
LAContext *context = [LAContext new];
2429
NSError *error;
2530

@@ -42,10 +47,14 @@ - (RNPermissionStatus)currentStatus {
4247
}
4348

4449
return RNPermissionStatusAuthorized;
50+
#endif
4551
}
4652

4753
- (void)requestWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
4854
rejecter:(void (^ _Nonnull)(NSError * _Nonnull))reject {
55+
#if TARGET_OS_TV
56+
resolve(RNPermissionStatusNotAvailable);
57+
#else
4958
LAContext *context = [LAContext new];
5059
NSError *error;
5160

@@ -77,10 +86,13 @@ - (void)requestWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
7786

7887
// Hack to invalidate FaceID verification immediately after being requested
7988
[self performSelector:@selector(invalidateContext) withObject:self afterDelay:0.05];
89+
#endif
8090
}
8191

8292
- (void)invalidateContext {
93+
#if !TARGET_OS_TV
8394
[_laContext invalidate];
95+
#endif
8496
}
8597

8698
- (void)onApplicationDidBecomeActive:(__unused NSNotification *)notification {
@@ -89,7 +101,10 @@ - (void)onApplicationDidBecomeActive:(__unused NSNotification *)notification {
89101
object:nil];
90102

91103
[RNPermissions flagAsRequested:[[self class] handlerUniqueId]];
104+
105+
#if !TARGET_OS_TV
92106
_resolve([self currentStatus]);
107+
#endif
93108
}
94109

95110
@end

ios/LocationAccuracy/RNPermissionHandlerLocationAccuracy.mm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ + (NSString * _Nonnull)handlerUniqueId {
1414

1515
- (void)checkWithResolver:(RCTPromiseResolveBlock _Nonnull)resolve
1616
rejecter:(RCTPromiseRejectBlock _Nonnull)reject {
17-
if (@available(iOS 14.0, *)) {
17+
if (@available(iOS 14.0, tvOS 14.0, *)) {
1818
switch ([CLLocationManager authorizationStatus]) {
1919
case kCLAuthorizationStatusNotDetermined:
2020
return reject(@"cannot_check_location_accuracy", @"Location permission hasn't been requested first", nil);
@@ -42,7 +42,7 @@ - (void)checkWithResolver:(RCTPromiseResolveBlock _Nonnull)resolve
4242
- (void)requestWithPurposeKey:(NSString * _Nonnull)purposeKey
4343
resolver:(RCTPromiseResolveBlock _Nonnull)resolve
4444
rejecter:(RCTPromiseRejectBlock _Nonnull)reject {
45-
if (@available(iOS 14.0, *)) {
45+
if (@available(iOS 14.0, tvOS 14.0, *)) {
4646
switch ([CLLocationManager authorizationStatus]) {
4747
case kCLAuthorizationStatusNotDetermined:
4848
return reject(@"cannot_request_location_accuracy", @"Location permission hasn't been requested first", nil);

0 commit comments

Comments
 (0)