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