Skip to content

Commit d1b2228

Browse files
authored
Merge pull request #192 from ddaddy/master
Fixed compiler warnings and added new delegate callback for biometrics authentication failure.
2 parents 12954bb + b923315 commit d1b2228

File tree

3 files changed

+56
-26
lines changed

3 files changed

+56
-26
lines changed

Demo/LTHPasscodeViewController Demo.xcodeproj/project.pbxproj

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@
171171
isa = PBXProject;
172172
attributes = {
173173
CLASSPREFIX = LTH;
174-
LastUpgradeCheck = 0800;
174+
LastUpgradeCheck = 0930;
175175
ORGANIZATIONNAME = "Roland Leth";
176176
TargetAttributes = {
177177
2AE8000517D9503000DBDE63 = {
@@ -272,14 +272,22 @@
272272
CLANG_CXX_LIBRARY = "libc++";
273273
CLANG_ENABLE_MODULES = YES;
274274
CLANG_ENABLE_OBJC_ARC = YES;
275+
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
275276
CLANG_WARN_BOOL_CONVERSION = YES;
277+
CLANG_WARN_COMMA = YES;
276278
CLANG_WARN_CONSTANT_CONVERSION = YES;
279+
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
277280
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
278281
CLANG_WARN_EMPTY_BODY = YES;
279282
CLANG_WARN_ENUM_CONVERSION = YES;
280283
CLANG_WARN_INFINITE_RECURSION = YES;
281284
CLANG_WARN_INT_CONVERSION = YES;
285+
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
286+
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
287+
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
282288
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
289+
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
290+
CLANG_WARN_STRICT_PROTOTYPES = YES;
283291
CLANG_WARN_SUSPICIOUS_MOVE = YES;
284292
CLANG_WARN_UNREACHABLE_CODE = YES;
285293
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
@@ -318,14 +326,22 @@
318326
CLANG_CXX_LIBRARY = "libc++";
319327
CLANG_ENABLE_MODULES = YES;
320328
CLANG_ENABLE_OBJC_ARC = YES;
329+
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
321330
CLANG_WARN_BOOL_CONVERSION = YES;
331+
CLANG_WARN_COMMA = YES;
322332
CLANG_WARN_CONSTANT_CONVERSION = YES;
333+
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
323334
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
324335
CLANG_WARN_EMPTY_BODY = YES;
325336
CLANG_WARN_ENUM_CONVERSION = YES;
326337
CLANG_WARN_INFINITE_RECURSION = YES;
327338
CLANG_WARN_INT_CONVERSION = YES;
339+
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
340+
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
341+
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
328342
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
343+
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
344+
CLANG_WARN_STRICT_PROTOTYPES = YES;
329345
CLANG_WARN_SUSPICIOUS_MOVE = YES;
330346
CLANG_WARN_UNREACHABLE_CODE = YES;
331347
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;

LTHPasscodeViewController/LTHPasscodeViewController.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
@brief Called when the passcode was entered successfully.
2323
*/
2424
- (void)passcodeWasEnteredSuccessfully;
25+
/**
26+
@brief Called when the TouchID/FaceID fails or is cancelled.
27+
*/
28+
- (void)biometricsAuthenticationFailed;
2529
/**
2630
@brief Called when the passcode was enabled.
2731
*/

LTHPasscodeViewController/LTHPasscodeViewController.m

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -328,20 +328,20 @@ - (void)resetPasscode {
328328
- (void)_handleBiometricsFailureAndDisableIt:(BOOL)disableBiometrics {
329329
dispatch_async(dispatch_get_main_queue(), ^{
330330
if (disableBiometrics) {
331-
_isUsingBiometrics = NO;
332-
_allowUnlockWithBiometrics = NO;
331+
self.isUsingBiometrics = NO;
332+
self.allowUnlockWithBiometrics = NO;
333333
}
334334

335-
_useFallbackPasscode = YES;
336-
_animatingView.hidden = NO;
335+
self.useFallbackPasscode = YES;
336+
self.animatingView.hidden = NO;
337337

338-
BOOL usingNavBar = _isUsingNavBar;
339-
NSString *logoutTitle = usingNavBar ? _navBar.items.firstObject.leftBarButtonItem.title : @"";
338+
BOOL usingNavBar = self.isUsingNavBar;
339+
NSString *logoutTitle = usingNavBar ? self.navBar.items.firstObject.leftBarButtonItem.title : @"";
340340

341341
[self _resetUI];
342342

343343
if (usingNavBar) {
344-
_isUsingNavBar = usingNavBar;
344+
self.isUsingNavBar = usingNavBar;
345345
[self _setupNavBarWithLogoutTitle:logoutTitle];
346346
}
347347
});
@@ -353,8 +353,13 @@ - (void)_setupFingerPrint {
353353
if (!self.biometricsContext && _allowUnlockWithBiometrics && !_useFallbackPasscode) {
354354
self.biometricsContext = [[LAContext alloc] init];
355355

356+
LAPolicy policy = LAPolicyDeviceOwnerAuthenticationWithBiometrics;
357+
if (@available(iOS 9.0, *)) {
358+
policy = LAPolicyDeviceOwnerAuthentication;
359+
}
360+
356361
NSError *error = nil;
357-
if ([self.biometricsContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
362+
if ([self.biometricsContext canEvaluatePolicy:policy error:&error]) {
358363
if (error) {
359364
return;
360365
}
@@ -370,12 +375,17 @@ - (void)_setupFingerPrint {
370375
_animatingView.hidden = YES;
371376

372377
// Authenticate User
373-
[self.biometricsContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
378+
[self.biometricsContext evaluatePolicy:policy
374379
localizedReason:LTHPasscodeViewControllerStrings(self.biometricsDetailsString)
375380
reply:^(BOOL success, NSError *error) {
376381

377382
if (error || !success) {
378383
[self _handleBiometricsFailureAndDisableIt:false];
384+
385+
if ([self.delegate respondsToSelector: @selector(biometricsAuthenticationFailed)]) {
386+
[self.delegate performSelector: @selector(biometricsAuthenticationFailed)];
387+
}
388+
379389
return;
380390
}
381391

@@ -559,7 +569,7 @@ - (void)_dismissMe {
559569
[self _resetUI];
560570
[_passcodeTextField resignFirstResponder];
561571
[UIView animateWithDuration: _lockAnimationDuration animations: ^{
562-
if (_displayedAsLockScreen) {
572+
if (self.displayedAsLockScreen) {
563573
if (LTHiOS8) {
564574
self.view.center = CGPointMake(self.view.center.x, self.view.center.y * 2.f);
565575
}
@@ -580,18 +590,18 @@ - (void)_dismissMe {
580590
}
581591
else {
582592
// Delete from Keychain
583-
if (_isUserTurningPasscodeOff) {
593+
if (self.isUserTurningPasscodeOff) {
584594
[self _deletePasscode];
585595
}
586596
// Update the Keychain if adding or changing passcode
587597
else {
588-
[self _savePasscode:_tempPasscode];
598+
[self _savePasscode:self.tempPasscode];
589599
//finalize type switching
590-
if (_isUserSwitchingBetweenPasscodeModes) {
591-
_isUserConfirmingPasscode = NO;
600+
if (self.isUserSwitchingBetweenPasscodeModes) {
601+
self.isUserConfirmingPasscode = NO;
592602
[self setIsSimple:!self.isSimple
593603
inViewController:nil
594-
asModal:_displayedAsModal];
604+
asModal:self.displayedAsModal];
595605
}
596606
}
597607
}
@@ -600,15 +610,15 @@ - (void)_dismissMe {
600610
[self.delegate performSelector: @selector(passcodeViewControllerWillClose)];
601611
}
602612

603-
if (_displayedAsLockScreen) {
613+
if (self.displayedAsLockScreen) {
604614
[self.view removeFromSuperview];
605615
[self removeFromParentViewController];
606616
}
607-
else if (_displayedAsModal) {
617+
else if (self.displayedAsModal) {
608618
[self dismissViewControllerAnimated:YES
609619
completion:nil];
610620
}
611-
else if (!_displayedAsLockScreen) {
621+
else if (!self.displayedAsLockScreen) {
612622
[self.navigationController popViewControllerAnimated:NO];
613623
}
614624
}];
@@ -839,8 +849,8 @@ - (void)updateViewConstraints {
839849

840850
if (self.isSimple) {
841851
[_digitTextFieldsArray enumerateObjectsUsingBlock:^(UITextField * _Nonnull textField, NSUInteger idx, BOOL * _Nonnull stop) {
842-
CGFloat constant = idx == 0 ? 0 : _horizontalGap;
843-
UIView *toItem = idx == 0 ? _simplePasscodeView : _digitTextFieldsArray[idx - 1];
852+
CGFloat constant = idx == 0 ? 0 : self.horizontalGap;
853+
UIView *toItem = idx == 0 ? self.simplePasscodeView : self.digitTextFieldsArray[idx - 1];
844854

845855
NSLayoutConstraint *digitX =
846856
[NSLayoutConstraint constraintWithItem: textField
@@ -855,7 +865,7 @@ - (void)updateViewConstraints {
855865
[NSLayoutConstraint constraintWithItem: textField
856866
attribute: NSLayoutAttributeTop
857867
relatedBy: NSLayoutRelationEqual
858-
toItem: _simplePasscodeView
868+
toItem: self.simplePasscodeView
859869
attribute: NSLayoutAttributeTop
860870
multiplier: 1.0f
861871
constant: 0];
@@ -864,7 +874,7 @@ - (void)updateViewConstraints {
864874
[NSLayoutConstraint constraintWithItem: textField
865875
attribute: NSLayoutAttributeBottom
866876
relatedBy: NSLayoutRelationEqual
867-
toItem: _simplePasscodeView
877+
toItem: self.simplePasscodeView
868878
attribute: NSLayoutAttributeBottom
869879
multiplier: 1.0f
870880
constant: 0];
@@ -873,12 +883,12 @@ - (void)updateViewConstraints {
873883
[self.view addConstraint:top];
874884
[self.view addConstraint:bottom];
875885

876-
if (idx == _digitTextFieldsArray.count - 1) {
886+
if (idx == self.digitTextFieldsArray.count - 1) {
877887
NSLayoutConstraint *trailing =
878888
[NSLayoutConstraint constraintWithItem: textField
879889
attribute: NSLayoutAttributeTrailing
880890
relatedBy: NSLayoutRelationEqual
881-
toItem: _simplePasscodeView
891+
toItem: self.simplePasscodeView
882892
attribute: NSLayoutAttributeTrailing
883893
multiplier: 1.0f
884894
constant: 0];
@@ -1448,7 +1458,7 @@ - (void)_resetTextFields {
14481458
// cancel in the Touch ID prompt. In some cases, the keyboard is present, but invisible
14491459
// after dismissing the alert unless we call becomeFirstResponder with a short delay
14501460
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
1451-
[_passcodeTextField becomeFirstResponder];
1461+
[self.passcodeTextField becomeFirstResponder];
14521462
});
14531463
}
14541464

0 commit comments

Comments
 (0)