RNPermissionHandlerFaceID.m 2.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #import "RNPermissionHandlerFaceID.h"
  2. @import LocalAuthentication;
  3. @implementation RNPermissionHandlerFaceID
  4. + (NSArray<NSString *> *)usageDescriptionKeys {
  5. return @[@"NSFaceIDUsageDescription"];
  6. }
  7. - (void)handleError:(NSError *)error
  8. withResolver:(void (^)(RNPermissionStatus status))resolve
  9. withRejecter:(void (^)(NSError *error))reject {
  10. if (error.code == -6) {
  11. resolve(RNPermissionStatusDenied);
  12. } else {
  13. reject(error);
  14. }
  15. }
  16. - (void)checkWithResolver:(void (^)(RNPermissionStatus status))resolve
  17. withRejecter:(void (^)(NSError *error))reject {
  18. if (@available(iOS 11.0, *)) {
  19. if (![RNPermissionsManager hasBeenRequestedOnce:self]) {
  20. return resolve(RNPermissionStatusNotDetermined);
  21. }
  22. LAContext *context = [LAContext new];
  23. NSError *error;
  24. [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error];
  25. if (error != nil) {
  26. return [self handleError:error withResolver:resolve withRejecter:reject];
  27. }
  28. if (context.biometryType != LABiometryTypeFaceID) {
  29. return resolve(RNPermissionStatusNotAvailable);
  30. }
  31. resolve(RNPermissionStatusAuthorized);
  32. } else {
  33. resolve(RNPermissionStatusNotAvailable);
  34. }
  35. }
  36. - (void)requestWithOptions:(__unused NSDictionary * _Nullable)options
  37. withResolver:(void (^)(RNPermissionStatus status))resolve
  38. withRejecter:(void (^)(NSError *error))reject {
  39. if (@available(iOS 11.0, *)) {
  40. LAContext *context = [LAContext new];
  41. NSError *error;
  42. [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error];
  43. if (error != nil) {
  44. return [self handleError:error withResolver:resolve withRejecter:reject];
  45. }
  46. if (context.biometryType != LABiometryTypeFaceID) {
  47. return resolve(RNPermissionStatusNotAvailable);
  48. }
  49. if ([RNPermissionsManager hasBeenRequestedOnce:self]) {
  50. return resolve(RNPermissionStatusAuthorized);
  51. }
  52. [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:[[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSFaceIDUsageDescription"] reply:^(BOOL success, NSError * _Nullable error) {
  53. if (error != nil) {
  54. [self handleError:error withResolver:resolve withRejecter:reject];
  55. } else {
  56. resolve(success ? RNPermissionStatusAuthorized : RNPermissionStatusDenied);
  57. }
  58. }];
  59. } else {
  60. resolve(RNPermissionStatusNotAvailable);
  61. }
  62. }
  63. @end