Лучше всего использовать API SafetyNet. Хотя он не может сказать root конкретно, он даст вам знать, что устройство ненадежно. Код также довольно прост.
val nonce = ByteArray(20)
SecureRandom().nextBytes(nonce)
SafetyNet.getClient(context).attest(nonce, API_KEY)
.addOnSuccessListener(this) { response ->
// Indicates communication with the service was successful.
// Use response.jwsResult to get the result data.
val resultParts = result.jwsResult.split(".")
if (resultParts.size == 3) {
val bytes = Base64Utils.decode(resultParts[1])
val newString = String(bytes)
val json = JSONObject(newString)
// Check json fields to see if device is secure
// NOTE best practice is to send this to server instead of handling locally.
}
}
.addOnFailureListener(this) { e: Exception ->
// An error occurred while communicating with the service.
if (e is ApiException) {
// An error with the Google Play services API contains some
// additional details.
// You can retrieve the status code using the
// e.statusCode property.
} else {
// A different, unknown type of error occurred.
Log.d(TAG, "Error: ${e.message}")
}
}
Вот различные проверенные сценарии. Пожалуйста, ознакомьтесь с Android документации
Я не на 100% уверен, возможно ли это, но Вы рассмотрели использование контроллеров другого представления для среды и портрета?
Когда необходимо, добавляю я UIView
объекты к представлению в IB, который я делаю скрытыми. Дайте ему хороший цвет фона, таким образом, Вы видите его и отправляете всему этому путь к фону. Затем используйте кадр того представления, когда необходимо будет установить кадр объекта. Если у Вас есть многие из них, Вы могли бы рассмотреть использование UILabel
вместо этого, таким образом, можно дать ему видимое имя в IB.
Если Вы волнуетесь по поводу проблем памяти, просто удаляете все они дополнительные UIView
s в ViewDidLoad
и просто сохраните их значения кадра в участнике CGRect
s. Это только работает, конечно, если у Вас нет ни одного из представлений, автоизменяют размер или меняют местоположение на, вращаются, который Вы, вероятно, не были должны так или иначе в этом случае. Я делаю это для изменять размер/менять местоположение по любой причине, не как раз в то самое время, когда экран вращается.
Атрибуты AutoSize объектов IBOutlet в инспекторе размеров IB (команда 3) предоставляют несколько довольно хороших опций для автоматического растяжения и позиционирования элементов. Вы можете контролировать положение экрана L / R и T / B, а также относительную ширину и высоту. Вы не можете получить полный контроль над макетом, но большинство основных операций есть.