Site icon AppTractor

Google запустил TrustedTime API

Точное время имеет решающее значение для широкого спектра функций приложений, от планирования и управления событиями до регистрации транзакций и протоколов безопасности. Однако пользователь может изменить время на устройстве, поэтому может потребоваться более точный источник времени, чем локальное системное время устройства. Именно поэтому Google представил TrustedTime API, который использует инфраструктуру Google для получения надежной временной метки, не зависящей от потенциально манипулируемых настроек локального времени устройства.

Как работает TrustedTime?

Новый API использует безопасную инфраструктуру Google для обеспечения надежного источника времени для вашего приложения. TrustedTime периодически синхронизирует свои часы с серверами Google, которые имеют доступ к высокоточному источнику времени, поэтому вам не нужно делать запрос на сервер каждый раз, когда вы хотите узнать текущее сетевое время. Кроме того, разработчики интегрировали уникальную модель, которая рассчитывает дрейф часов устройства. Это позволит вам узнать, когда время может быть неточным между сетевыми синхронизациями.

Примеры использования TrustedTime

TrustedTime API дает множество преимуществ для повышения надежности и безопасности ваших приложений:

Начало работы с TrustedTime API

TrustedTime API построен на базе сервисов Google Play, что делает интеграцию простой для большинства разработчиков Android.

Самый простой способ интеграции — инициализировать TrustedTimeClient на ранней стадии жизненного цикла приложения, например в методе onCreate() класса Application. В следующем примере используется инъекция зависимостей с Hilt, чтобы сделать клиент времени доступным для компонентов во всем приложении.

[Опционально] Настройка инъекции зависимостей

// TrustedTimeClientAccessor.kt
import com.google.android.gms.tasks.Task
import com.google.android.gms.time.TrustedTimeClient

interface TrustedTimeClientAccessor {
  fun createClient(): Task<TrustedTimeClient>
}

// TrustedTimeModule.kt
@Module
@InstallIn(SingletonComponent::class)
class TrustedTimeModule {
  @Provides
  fun provideTrustedTimeClientAccessor(
    @ApplicationContext context: Context
  ): TrustedTimeClientAccessor {
    return object : TrustedTimeClientAccessor {
      override fun createClient(): Task<TrustedTimeClient> {
        return TrustedTime.createClient(context)
      }
    }
  }
}

Инициализация

// TrustedTimeDemoApplication.kt
@HiltAndroidApp
class TrustedTimeDemoApplication : Application() {

  @Inject
  lateinit var trustedTimeClientAccessor: TrustedTimeClientAccessor

  var trustedTimeClient: TrustedTimeClient? = null
    private set

  override fun onCreate() {
    super.onCreate()
    trustedTimeClientAccessor.createClient().addOnCompleteListener { task ->
      if (task.isSuccessful) {
        // Stash the client
        trustedTimeClient = task.result
      } else {
        // Handle error, maybe retry later
        val exception = task.exception
      }
    }
    // To use Kotlin Coroutine, you can use the await() method, 
    // see https://developers.google.com/android/guides/tasks#kotlin_coroutine for more info.
  }
}

Использование TrustedTimeClient 

// Retrieve the TrustedTimeClient from your application class
  val myApp = applicationContext as TrustedTimeDemoApplication

  // In this example, System.currentTimeMillis() is used as a fallback if the
  // client is null (i.e. client creation task failed) or when there is no time
  // signal available. You may not want to do this if using the system clock is
  // not suitable for your use case.
  val currentTimeMillis =
    myApp.trustedTimeClient?.computeCurrentUnixEpochMillis()
        ?: System.currentTimeMillis()
  // trustedTimeClient.computeCurrentInstant() can be used if Instant is
  // preferred to long for Unix epoch times and you are able to use the APIs.

Использование в таких недолговечных компонентах, как активити

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
  @Inject
  lateinit var trustedTimeAccessor: TrustedTimeAccessor

   private var trustedTimeClient: TrustedTimeClient? = null

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    ...
    trustedTimeAccessor.createClient().addOnCompleteListener { task ->
      if (task.isSuccessful) {
          // Stash the client
          trustedTimeClient = task.result
        } else {
         // Handle error, maybe retry later or use another time source.
          val exception = task.exception
        }
    }
  }

  private fun getCurrentTimeInMillis() : Long? {
    return trustedTimeClient?.computeCurrentUnixEpochMillis()
  }
}

Доступность и ограничения TrustedTime API

TrustedTime API доступен на всех устройствах с сервисами Google Play на Android 5 (Lollipop) и выше. Чтобы получить доступ к новому API, необходимо добавить зависимость com.google.android.gms:play-services-time:16.0.1 (или выше). Для использования этого API не требуется никаких дополнительных разрешений. Однако TrustedTime необходимо подключение к интернету после запуска устройства, чтобы предоставлять временные метки. Если устройство не подключалось к интернету с момента загрузки, API TrustedTime не вернет правильное время.

Важно отметить, что внутренние часы устройства могут смещаться под воздействием таких факторов, как температура, режим сна и уровень заряда батареи. TrustedTime не предотвращает этот дрейф, но его API предоставляют оценку ошибки для каждой временной метки. Используйте эту оценку, чтобы определить, соответствует ли точность временной метки требованиям вашего приложения. Хотя TrustedTime усложняет манипуляции пользователей со временем, к которому обращается ваше приложение, он не гарантирует полной безопасности. Для подмены времени на устройстве по-прежнему можно использовать передовые методы.

Ссылки

Exit mobile version