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