我正在努力实现以下代码:
我看了钥匙扣和身份验证与Touch ID演示,并了解以下内容:
如果在向Keychain中添加新值时设置了正确的参数,则下次尝试将其取出时,系统将自动显示Touch ID弹出窗口.
我写了一些代码,但我的假设不起作用.这就是我写的:
//
// Secret value to store
//
let valueData = "The Top Secret Message V1".data(using: .utf8)!;
//
// Create the Access Controll object telling how the new value
// should be stored. Force Touch ID by the system on Read.
//
let sacObject =
SecAccessControlCreateWithFlags(kCFAllocatorDefault,
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
.userPresence,
nil);
//
// Create the Key Value array, that holds the query to store
// our data
//
let insert_query: NSDictionary …
Run Code Online (Sandbox Code Playgroud) 我想知道Apple是否打算使用TouchID功能调用这些生命周期方法.
是否有可能检查touchID进程是否正在调用这些方法(我想避免在app delegate中设置BOOL,如果当前显示的是touchID输入,则设置该BOOL ...)
BR
我已经为我的应用程序安全目的集成了LocalAuthentication,它一直支持基于"Touch Id"的支持.但是现在,苹果最近还增加了"基于身份识别"的身份验证.
如何检查设备支持哪种类型的身份验证.触摸ID或面部ID?
我目前正在开发一个iOS应用程序,使用户可以使用TouchID登录应用程序,但首先他们必须首先在应用程序内设置密码.问题是,要显示设置密码选项以启用TouchID登录,我需要检测iOS设备是否支持TouchID.
使用LAContext和canEvaluatePolicy(如此处的答案如果设备支持Touch ID),如果用户在其iOS设备上设置了密码,我可以确定当前设备是否支持TouchID .这是我的代码片段(我使用的是Xamarin,所以它在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;
}
Run Code Online (Sandbox Code Playgroud)
如果用户尚未设置设备密码,则无论设备是否实际支持TouchID ,authError都将返回" PasscodeNotSet "错误.
如果用户的设备支持TouchID,我想在我的应用程序中始终显示TouchID选项,无论用户是否在其设备上设置了密码(我只是警告用户首先在他们的设备上设置密码).反之亦然,如果用户的设备不支持TouchID,我显然不想在我的应用程序中显示TouchID选项.
所以我的问题是,无论用户是否在其设备上设置了密码,是否有一种很好的方法可以始终如一地确定iOS设备是否支持TouchID?
我能想到的唯一解决方法是确定设备的体系结构(在确定iOS设备是32位还是64位时可以回答),因为只有具有64位体系结构的设备才支持TouchID.但是,我正在寻找是否有更好的方法来做到这一点.
先谢谢!:)
我正在开发一个需要Touch ID身份验证的应用程序,所以有什么方法可以在模拟器中使用Touch ID(指纹扫描仪)吗?
另外,请分享使用LocalAuthentication框架的某种示例代码.
使用Xcode 9为IOS11编译我的应用程序时,我收到以下警告:
warning: 'touchIDLockout' was deprecated in iOS 11.0: use LAErrorBiometryLockout
warning: 'touchIDNotEnrolled' was deprecated in iOS 11.0: use LAErrorBiometryNotEnrolled
warning: 'touchIDNotAvailable' was deprecated in iOS 11.0: use LAErrorBiometryNotAvailable
Run Code Online (Sandbox Code Playgroud)
我正在使用touchID,但我没有使用touchIdLockout ... cste,touchID工作正常.
我该如何删除这些警告?
我将此追踪到一个原因.LAError
从我的代码中的LocalAuthentication框架引用就足以显示这些警告.
重现的步骤(在Xcode 9.2中尝试过):
将这些行添加到AppDelegate.swift
:
import LocalAuthentication
Run Code Online (Sandbox Code Playgroud)
还有一行appDidFinishLaunching
:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let _: LAError? = nil
return true
}
Run Code Online (Sandbox Code Playgroud)构建应用程序.
该let _: LAError? = nil
行足以显示三个警告.但是,警告与任何特定代码行都没有关联.它们出现在构建日志中,没有任何文件/行引用:
<unknown>:0: warning: 'touchIDLockout' was …
Run Code Online (Sandbox Code Playgroud) 例如,我有一个带身份验证的网站.是否有可以从JavaScript使用的指纹API登录用户?Android和iOS等移动操作系统都有这样的API.因此,理论上至少移动版浏览器可以提供这样的功能.但我无法在网上找到任何关于它的信息.
javascript fingerprint asp.net-web-api touch-id android-fingerprint-api
LAContext具有检查设备是否可以评估触摸ID并提供错误消息的方法.问题是系统在两种情况下给出了相同的错误消息"LAErrorPasscodeNotSet":
1)如果用户具有Touch ID,但在设置中将其关闭(带iOS8的iPhone 5s)
2)如果设备没有Touch ID(带iOS8的iPad)
问:如何检查设备是否支持Touch ID,但未在设置中打开?
更新:
已经创建了关于这个bug(ID#18364575)的Apple门票,并收到了回答:
" Engineering已根据以下信息确定此问题的行为符合预期:
如果未设置密码,您将无法检测Touch ID的存在.一旦设置了密码,canEvaluatePolicy将最终返回LAErrorTouchIDNotAvailable或LAErrorTouchIdNotEnrolled,您将能够检测Touch ID存在/状态.
如果用户在具有Touch ID的手机上禁用了密码,则他们知道他们将无法使用Touch ID,因此这些应用无需检测Touch ID状态或推广基于Touch ID的功能."
我已经成功地分别使用钥匙串和钥匙串共享(在多个设备之间同步钥匙串项)来实现TouchID.当我尝试同时执行它们时,我收到错误"-50",这是无效参数.从下面的代码中,删除kSecAttrAccessControl或kSecAttrSynchronizable按预期工作.
根据我的经验(阅读 - 几天的挫折)到目前为止,并基于一些钥匙串API简化工具(如UICKeychainStore)的功能,似乎如果我使用Touch ID身份验证,钥匙串共享将无法工作,反之亦然.我正在寻找可以说明但无法找到它的Apple文档.
我已经浏览了Apple的SecItem.h页面,我找到了一个有用的信息,其中包含有关kSecAttrAccessible和kSecAttrSynchronizable的信息:"如果在OS X或iOS上都指定了这两个属性,则kSecAttrAccessible密钥的值可能只是其名称之一不会以"ThisDeviceOnly"结尾,因为那些不能同步到另一台设备."但是,我没有使用"ThisDeviceOnly"(我目前正在使用kSecAttrAccessibleAlways进行测试)
您能否指出Apple是否以及在何处记录此限制?这将有助于我记录它的记录,并继续前进.谢谢.
- (void)addKeychainItemWithIdentifier:(NSString *)identifier andData:(NSData *)data {
CFErrorRef error = NULL;
SecAccessControlRef sacObject;
sacObject = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
kSecAttrAccessibleAlways,
kSecAccessControlUserPresence, &error);
if(sacObject == NULL || error != NULL)
{
NSString *msg0 = [NSString stringWithFormat:NSLocalizedString(@"SEC_ITEM_ADD_CAN_CREATE_OBJECT", nil), error];
[self printResultWithMessage:msg0];
return;
}
NSDictionary *attributes = @{
(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecValueData: data,
(__bridge id)kSecAttrAccessible:(__bridge id)kSecAttrAccessibleAlways,
(__bridge id)kSecAttrService: identifier,
(__bridge id)kSecAttrSynchronizable:(__bridge …
Run Code Online (Sandbox Code Playgroud) 有没有办法确定是否已使用Touch ID访问控制在iOS钥匙串中设置了项目(密码,令牌等)而没有提示用户输入Touch ID?在执行操作之前,我们需要确定凭证是否已保存到钥匙串(带有Touch ID保护),但我们不希望使用Touch ID提示中断用户.
我试过以下......
NSMutableDictionary *query = ...
query[(__bridge id)kSecUseNoAuthenticationUI] = (__bridge id)kCFBooleanTrue;
OSStatus opStatus = SecItemCopyMatching((__bridge CFDictionaryRef)query, NULL);
...
Run Code Online (Sandbox Code Playgroud)
但是,当调用此代码时,用户仍会看到Touch ID提示.我们不希望任何东西在UI上进行显示,而只是想在返回一个错误OSStatus
,如果触摸ID 会被需要.
有什么想法吗?
touch-id ×10
ios ×9
ios8 ×4
iphone ×3
keychain ×3
face-id ×2
swift ×2
compilation ×1
fingerprint ×1
ios11 ×1
ipad ×1
javascript ×1
objective-c ×1
security ×1
xamarin ×1
xcode ×1