1// Copyright © 2019-present 650 Industries. All rights reserved. 2 3#if __has_include(<EXLocalAuthentication/EXLocalAuthentication.h>) 4#import "EXScopedLocalAuthentication.h" 5#import <LocalAuthentication/LocalAuthentication.h> 6#import <UMCore/UMUtilities.h> 7#import "EXConstantsBinding.h" 8#import <UMConstantsInterface/UMConstantsInterface.h> 9 10@interface EXScopedLocalAuthentication () 11 12@property (nonatomic, assign) BOOL isInExpoClient; 13 14@end 15 16@implementation EXScopedLocalAuthentication 17 18- (void)setModuleRegistry:(UMModuleRegistry *)moduleRegistry 19{ 20 _isInExpoClient = [((EXConstantsBinding *)[moduleRegistry getModuleImplementingProtocol:@protocol(UMConstantsInterface)]).appOwnership isEqualToString:@"expo"]; 21} 22 23UM_EXPORT_METHOD_AS(authenticateAsync, 24 authenticateWithOptions:(NSDictionary *)options 25 resolve:(UMPromiseResolveBlock)resolve 26 reject:(UMPromiseRejectBlock)reject) 27{ 28 BOOL isInExpoClient = _isInExpoClient; 29 [super authenticateWithOptions:options resolve:^(NSDictionary *result) { 30 if (isInExpoClient && [[self class] isFaceIdDevice]) { 31 NSString *usageDescription = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"NSFaceIDUsageDescription"]; 32 33 if (!usageDescription) { 34 NSMutableDictionary *scopedResult = [[NSMutableDictionary alloc] initWithDictionary:result]; 35 scopedResult[@"warning"] = @"Face ID is not available in Expo Go. You can use it in a standalone Expo app by providing `NSFaceIDUsageDescription`."; 36 resolve(scopedResult); 37 return; 38 } 39 } 40 resolve(result); 41 } reject:reject]; 42} 43 44@end 45#endif 46