您可能知道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结尾
的事实?Task
OnSuccessListener
onFailureListener
您是否有关于SafetyNetClient.attest()
通常运行多长时间才能在其中一位听众中完成的经验?
我们已经可以排除ResusltWaiter
组件中的任何错误,因为它在我们应用程序的其他几个部分中使用,并且可以完美运行。
提前感谢您的帮助和反馈!