Tôi hiện đang phát triển ứng dụng iOS cho phép người dùng đăng nhập vào ứng dụng bằng TouchID, nhưng trước hết họ phải thiết lập mật khẩu bên trong ứng dụng trước. Vấn đề là, để hiển thị tùy chọn mật khẩu thiết lập để bật đăng nhập TouchID, tôi cần phát hiện xem thiết bị iOS có hỗ trợ TouchID hay không.Xác định xem thiết bị iOS có hỗ trợ TouchID mà không cài đặt mật mã
Sử dụng LAContext và canEvaluatePolicy (như các câu trả lời ở đây If Device Supports Touch ID), tôi có thể xác định xem thiết bị hiện hỗ trợ TouchID nếu người dùng đã thiết lập mật mã trên thiết bị iOS của họ. Dưới đây là một đoạn mã của tôi (Tôi đang sử dụng Xamarin, vì vậy trong C#):
static bool DeviceSupportsTouchID()
{
if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
{
var context = new LAContext();
NSError authError;
bool touchIDSetOnDevice = context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out authError);
return (touchIDSetOnDevice || (LAStatus) Convert.ToInt16(authError.Code) != LAStatus.TouchIDNotAvailable);
}
return false;
}
Nếu người dùng chưa thiết lập các thiết bị mật mã, các authError sẽ chỉ trả lại "PasscodeNotSet" lỗi bất kể thiết bị có hỗ trợ TouchID hay không.
Nếu thiết bị của người dùng hỗ trợ TouchID, tôi muốn luôn hiển thị tùy chọn TouchID trong ứng dụng của mình bất kể người dùng đã thiết lập mật mã trên thiết bị của họ (trước tiên tôi sẽ cảnh báo người dùng thiết lập mật mã trên thiết bị của họ). Ngược lại, nếu thiết bị của người dùng không hỗ trợ TouchID, tôi rõ ràng không muốn hiển thị tùy chọn TouchID trong ứng dụng của mình. Vì vậy, câu hỏi của tôi là, có một cách hay để xác định liệu thiết bị iOS có hỗ trợ TouchID không phụ thuộc vào việc người dùng đã thiết lập mật mã trên thiết bị của họ hay chưa? Có phải không?
Cách khắc phục duy nhất tôi có thể nghĩ là xác định kiến trúc của thiết bị (được trả lời trong Determine if iOS device is 32- or 64-bit), vì TouchID chỉ được hỗ trợ trên các thiết bị có kiến trúc 64 bit. Tuy nhiên, tôi đang tìm kiếm nếu có bất kỳ cách nào đẹp hơn để làm điều này.
Cảm ơn trước! :)
Cám ơn câu trả lời của bạn, nhưng tôi sợ nó không phải là giải pháp tôi đang tìm kiếm. Theo tôi biết, lớp LAContext có sẵn trên tất cả các thiết bị chạy iOS8. Nhưng trong trường hợp thiết bị chạy iOS8 nhưng không có TouchID, thì mệnh đề if sẽ là true và NSError sẽ vẫn trả về PasscodeNotSet ... Sửa lỗi nếu tôi nhầm ở đây :) – ABVincita
Có thể có, nhưng ' hasTouchId' sẽ là false vì vậy TouchID không khả dụng cho bạn với tư cách là nhà phát triển để sử dụng. – rckoenes
Có hasTouchId cũng sẽ sai - nhưng sau đó không có cách nào để tôi xác định xem thiết bị có thực sự hỗ trợ TouchID hay không. Như đã nêu trong câu hỏi của tôi ở trên, vấn đề chính ở đây là khi người dùng không thiết lập mật mã trên thiết bị của họ; hasTouchId sẽ là false và NSError sẽ là PasscodeNotSet bất kể thiết bị có hỗ trợ TouchID hay không. – ABVincita