我一直在努力将Touch ID支持集成到我正在处理的应用程序中.然而,它表现得非常不一致.我看到的一个常见问题是在新的应用程序启动它按预期工作,但随后在应用程序的背景,并将其带到前台我收到一个错误
evaluatePolicy:localizedReason:reply:
Run Code Online (Sandbox Code Playgroud)
它甚至没有多大意义(我从未看到过触摸警报)
Error Domain=com.apple.LocalAuthentication Code=-1004 "User interaction is required." UserInfo=0x171470a00 {NSLocalizedDescription=User interaction is required.}
Run Code Online (Sandbox Code Playgroud)
我已经尝试在应用程序已经运行时显示touchid警报,当它刚刚被预先考虑时,似乎并不重要.在最初的应用程序启动后,每次都会破坏它.
其他人遇到这个?
作为参考,这是我正在使用的代码:
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 != …Run Code Online (Sandbox Code Playgroud) 我的报告中出现了各种崩溃,报告了以下原因:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'failed to generate newParagraphStyle'
Run Code Online (Sandbox Code Playgroud)
发生这种情况的应用确实以编程方式设置了很多属性文本(字体,颜色,有时是段落样式),但我找不到与此直接相关的任何模式.我所看到的几乎所有的报告都包含了堆栈跟踪中某种形式的setLineBreakMode的引用:
-[_UICascadingTextStorage(Accessors) setLineBreakMode:]
Run Code Online (Sandbox Code Playgroud)
我自己从来没有能够重新创建它,但它确实在我的崩溃报告中定期出现.我没有专门在这些地方设置换行模式.有任何想法吗?
编辑:我花了更多的时间研究这个,并找到了一个模式来重现.所以我有一个UITextField,当你点击键盘上的返回时,检测到"/ n"字符,文本字段将重新启动其第一个响应者状态.如果在此之后的任何时候,您尝试修改该字段的文本(或属性文本),它会崩溃.有一个关键元素,只有在设置了typingAttributes时才会发生.他们的目标并不重要.
我尝试了一切,在设置文本之前将typingAttributes设置为nil,设置一个固定的字符串以确保它不是我们设置的 - 没有运气.总是崩溃.一旦你进入这种状态,文本字段就会被打破.避免它的黑客就是吹走文本域并创建一个新文本 - 但就是这样.一个黑客.
一些更有趣的信息,代码检测返回键的方式写得不好 - 它检测到"/ n"并返回NO:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
Run Code Online (Sandbox Code Playgroud)
它没有使用适当的方法:
- (BOOL)textFieldShouldReturn:(UITextField *)textField
Run Code Online (Sandbox Code Playgroud)
在应用程序的一个地方,这实际上修复了崩溃,在其他地方,它总是使用正确的方法,崩溃仍在发生.唯一的解决方法是吹走文本域并创建一个新文本域.对我来说,这似乎是iOS本身的一个错误.
我正在使用新的 iOS 9 API 编写一些 UI 测试。我遇到的一件事是,当您运行测试时,它有自己的目标和模拟器上自己的“应用程序”。这意味着我无法访问保存在主应用程序文档文件夹中的 sqlite 文件。我在弄清楚如何实际打开此文件时遇到问题。有人有解决方案吗?