代码之家  ›  专栏  ›  技术社区  ›  Abin Koshy Cheriyan

iPhone应用程序崩溃,出现错误[UIApplication_cachedSystemAnimationFenceCreatingIfNecessary:]

  •  9
  • Abin Koshy Cheriyan  · 技术社区  · 8 年前

    我在应用程序商店中有一个使用Touch ID的iPhone应用程序。如果启用了Touch ID,则用户将使用它进行身份验证,否则用户需要输入PIN才能登录应用程序。

    IOS 10.1发布后,当我查看崩溃报告时,崩溃次数增加了。从事故报告来看,它指向 [UIApplication _cachedSystemAnimationFenceCreatingIfNecessary:] 当我在Xcode中打开应用程序时,它专注于 [self dismissViewControllerAnimated:YES completion:nil]; .

    Crash Report

    我写的代码如下:

    -(void) showTouchIDAuthentication{
    
        LAContext *myContext = [[LAContext alloc] init];
        NSError *authError = nil;
        NSString *myLocalizedReasonString = @"Authenticate using your finger to access My Account Menu.";
        if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) {
            [myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
                      localizedReason:myLocalizedReasonString
                                reply:^(BOOL success, NSError *error) {
                                    if (success) {
                                        NSLog(@"User is authenticated successfully");
                                        [self dismissViewControllerAnimated:YES completion:nil];
                                    } else {
       }];
        }
    
    }
    

    当我在iPhone6、IOS10上测试时,一切都很好。不知道如何模拟问题。

    谁能帮我查一下我是不是缺了什么东西?请帮我解决这个崩溃问题。

    1 回复  |  直到 8 年前
        1
  •  8
  •   Fidel López    8 年前

    通常,完成处理程序不在主线程上运行。所有与UI相关的工作都必须在主线程上完成(包括关闭视图控制器)。

    我建议在主线程块上添加dissult行,如下所示:

    -(void) showTouchIDAuthentication{
    
    LAContext *myContext = [[LAContext alloc] init];
    NSError *authError = nil;
    NSString *myLocalizedReasonString = @"Authenticate using your finger to access My Account Menu.";
    if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) {
        [myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
                  localizedReason:myLocalizedReasonString
                            reply:^(BOOL success, NSError *error) {
                                if (success) {
                                    NSLog(@"User is authenticated successfully");
    
                                    [[NSOperationQueue mainQueue] addOperationWithBlock:^ {
                                        [self dismissViewControllerAnimated:YES completion:nil];
                                    }];
    
                                } else {
       }];
        }
    
    }