2014-09-18 13 views
7

Tôi đã và đang tích hợp hỗ trợ Touch ID vào một ứng dụng tôi đang làm việc. Tuy nhiên nó diễn xuất rất không nhất quán. Một trong những vấn đề chung tôi thấy là trên một phóng ứng dụng tươi nó hoạt động như mong đợi, nhưng sau đó trên backgrounding ứng dụng, và đưa nó vào foreground Tôi nhận được một lỗi trở lại từLỗi iOS 8 Touch ID "Yêu cầu tương tác người dùng".

evaluatePolicy:localizedReason:reply: 

Nó không thậm chí làm cho rất nhiều ý nghĩa (tôi chưa bao giờ nhìn thấy cảnh báo touchid)

Error Domain=com.apple.LocalAuthentication Code=-1004 "User interaction is required." UserInfo=0x171470a00 {NSLocalizedDescription=User interaction is required.} 

tôi đã cố gắng trình bày các báo touchid khi ứng dụng đang chạy, khi nó chỉ là cận cảnh, dường như không thành vấn đề. Của nó bị hỏng trên mỗi lần sau khi khởi động ứng dụng ban đầu.

Bất kỳ ai khác đều tham gia vào điều này?

Để tham khảo, đây là mã Tôi đang sử dụng:

if (_useTouchId && [LAContext class]) { 
    LAContext *myContext = [[LAContext alloc] init]; 
    NSError *authError = nil; 

    if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) { 
     _didPresentTouchId = YES; 
     [myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"Use your Touch ID to open *****" reply:^(BOOL success, NSError *error) { 
      dispatch_async(dispatch_get_main_queue(),^{ 
       if (success) { 
        _isClosing = YES; 

        [self hide]; 
        if (_successBlock) { 
         _successBlock(); 
        } 
       } 
       else if (error && error.code != -2 && error.code != -3 && error.code != -1004) { 
        [[[UIAlertView alloc] initWithTitle:@"Error" message:@"Authentication failed, please enter your Pin" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil] show]; 
       } 
       else { 
        if (error) { 
         DDLogError(@"TouchID error: %@", error.description); 
        } 

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, .6 * NSEC_PER_SEC), dispatch_get_main_queue(),^{ 
         [self keyboardButtonTouched]; 
        }); 
       } 
      }); 
     }]; 
    } 
} 
+0

cũng nhận được điều này. Thực sự anoying – gallileo

+1

Tôi đang gặp cùng một lỗi nhưng trong trường hợp của tôi ngay cả khi ứng dụng đã hoạt động và ở nền trước. Tôi đang làm việc trên một khuôn khổ được sử dụng bởi một ứng dụng khác nhưng mã của tôi hoạt động tốt khi tôi thử nó trên một dự án độc lập. Tôi có mã được đặt trong viewDidAppear của bộ điều khiển xem ban đầu nhưng nó luôn dẫn đến lỗi. – schystz

+0

@schystz Tôi có cùng ... Tôi thề là sau khi tôi thay đổi id gói .... Bạn đã tìm thấy một giải pháp? !! – maxisme

Trả lời

7

Thường PIN xem điều khiển được đẩy trước khi bước vào nền trong:

- (void)applicationDidEnterBackground:(UIApplication *)application 

Vì vậy, thông tin bên trong ứng dụng của sẽ không xuất hiện khi phân trang thông qua hình ảnh xem trước ứng dụng (nút nhấn đúp vào nút trang chủ). Tôi đoán bạn đang làm một cái gì đó tương tự.

Vấn đề là API mới của LocalAuthentication yêu cầu chế độ xem cuộc gọiController hiển thị. Đây là lý do tại sao bạn không nên gọi hàm "showTouchID" trước khi từ chức về nền. Thay vì gọi là "showTouchID" chức năng khi nhập foreground:

- (void)applicationWillEnterForeground:(UIApplication *)application 

Và nó cũng làm việc. Đừng quên gọi nó khi ứng dụng được khởi chạy lần đầu tiên (trong trường hợp đó ..willEnterForeground sẽ không được gọi).

+0

Đây là điều ít nhiều xảy ra. Tôi đã kết thúc chỉ cần thả màn hình giật gân vào cửa sổ chính xem trên nền (vì vậy bạn không thể nhìn thấy nội dung) và sau đó trình bày điều khiển PIN khi ứng dụng được mở ra, và loại bỏ màn hình giật gân. Hoạt động tốt. –

3

@hetzi câu trả lời thực sự đã giúp tôi, nhưng tôi có nhiều điều để thêm vào điều này. Về cơ bản lỗi này xảy ra khi ứng dụng của bạn được đánh thức từ nền và một nơi nào đó trên mã bạn đang yêu cầu Touch ID (trường hợp của tôi là loại xác thực cục bộ, tôi chưa thử nghiệm với loại khóa). Không có cách nào người dùng có thể tương tác với Touch ID được nhắc trong khi ứng dụng đang chạy trên nền, do đó thông báo lỗi.

Tương tác của người dùng là bắt buộc.

Lý do ứng dụng của tôi đến từ nền là: Đẩy Notifications hoặc Apple Watch.

sửa chữa của tôi đang làm một cái gì đó như thế này trên các phương pháp viewDidLoad của VC ban đầu của tôi:

if ([UIApplication sharedApplication].applicationState != UIApplicationStateBackground) { 
    [self promptForTouchID]; 
} 

Tôi đã sử dụng != bởi vì, khi ứng dụng của bạn đầu tiên ra mắt nó đang ở trong trạng thái UIApplicationStateInactive. Và trạng thái đó không tạo ra lỗi Touch ID vì lời nhắc sẽ xuất hiện.

Tôi cũng gọi [self promptForTouchID] trên thông báo UIApplicationWillEnterForegroundNotification, nhưng vì bạn biết rằng ứng dụng sẽ nhập tiền cảnh, bạn không cần phải kiểm tra tại đây.

Các vấn đề liên quan