2

您可能知道SafetyNetClient.attest()异步运行。
但在我们的应用程序中,我们希望SafetyNetApi.AttestationResponse同步接收。因为需要 SafetyNet 结果作为另一个用例的输入。为了实现这一点,我们实现了一个看起来像这样
的“包装器” 。SafetyNetClient.attest()

public Result getAttestationResult(Input input) {
    
    // NOTE: ResultWaiter is our own component to get the result of a async operation in a synchronous manner.
    ResultWaiter<Result> waiter = ResultWaiter.<Result>builder(executor)
      .timeout(10) // timeout set to 10 seconds
      .build();

    Task<SafetyNetApi.AttestationResponse> task = SafetyNet.getClient(context).attest(input.nonce(), input.apiKey());

    // notify ResultWaiter if SafetyNetClient returns a result
    task.addOnSuccessListener(attestationResponse -> waiter.setResult(Result.builder()
      .jwsResult(attestationResponse.getJwsResult())
      .build()));

    // notify ResultWaiter if SafetyNetClient returns an exception
    task.addOnFailureListener(exception -> waiter.setResult(Result.builder()
      .error(exception)
      .build()));

    try {
      // NOTE: waiter.waitForResult() blocks the current thread where getAttestationResult() was called 
      // (of course this can not be the Main/UI Thread!)
      // the blocking is released if
      //    1. waiter.setResult() is called
      //    2. if configured timeout runs out, this method throws a TimeoutException
      return waiter.waitForResult();
    } catch (TimeoutException exception) {
      return Result.builder()
        .error(exception)
        .build();
    }
  }

我们目前面临的问题是,我们有许多最终用户,他们最终都进入了catch (TimeoutException e)这个代码示例的块中。
这意味着 SafetyNet 在配置的 10 秒超时中没有提供结果或错误。

在哪些情况下 SafetyNet 可能不会在 10 秒内返回结果?
除了可能是连接不良的明显原因。肯定有其他原因,因为我们有很多最终用户遇到这个问题。

我们不想简单地将超时时间增加到 30 或 40 秒,因为这会影响用户在需要 SafetyNet 证明的特定应用流程中的用户体验。

您的应用程序逻辑是否仅实现无限期SafetyNetClient.attest()地等待Task返回结果或异常?而且您依赖于必须以or结尾
的事实?TaskOnSuccessListeneronFailureListener

您是否有关于SafetyNetClient.attest()通常运行多长时间才能在其中一位听众中完成的经验?

我们已经可以排除ResusltWaiter组件中的任何错误,因为它在我们应用程序的其他几个部分中使用,并且可以完美运行。

提前感谢您的帮助和反馈!

4

1 回答 1

0

我在 3 天内一直在努力解决这个问题,起初我认为我在配置 SafetyNet 时遇到了一些问题。但是我终于发现它只发生在物理 Android 设备上,并且重新启动路由器/调制解调器(设备正在连接的)有帮助。

这个答案帮助了我:https ://stackoverflow.com/a/51122769/10179386

于 2021-06-27T14:08:30.503 回答