Я загружаю URL-адрес аутентификации Google SAML для аутентификации пользователя с помощью WebView. Когда пользователь успешно входит в систему, вводя свои учетные данные, я получаю этот ответ JSON в WebView:
{
"status": 1,
"msg": "user Authenticated !!",
"user": {
"userFirstName": "John",
"userLastName": "Doe",
"userEmail": "john@example.in",
"userType": "manager",
"manager": true,
"employee": false,
"teamLead": false
},
"token": "eyJhbGciOiJI................."
}
Я хочу извлечь эту информацию из WebView и сохранить ее локально.
Чтобы реализовать WebView в мультиплатформе Kotlin, я я использую эту библиотеку:
Сообщение на среднем уровне: https://medium.com/@kevinnzou/web-every ... 9b1264b370
Репозиторий GitHub: https ://github.com/KevinnZou/compose-webview-multiplatform
Реализация WebView:
@Composable
internal fun LoginWebView(navHostController: NavHostController? = null) {
val state = rememberWebViewState(url = SAML_DEV)
val navigator = rememberWebViewNavigator()
val jsBridge = rememberWebViewJsBridge()
jsBridge.register(LoginMessageHandler())
state.webSettings.apply {
isJavaScriptEnabled = true
}
DisposableEffect(Unit) {
state.webSettings.apply {
logSeverity = KLogSeverity.Verbose
}
onDispose { }
}
MaterialTheme {
Column {
TopAppBar(
title = { Text(text = "Login") },
navigationIcon = {
IconButton(onClick = {
if (navigator.canGoBack) {
navigator.navigateBack()
} else {
navHostController?.popBackStack()
}
}) {
Icon(
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = "Back",
)
}
},
)
val loadingState = state.loadingState
if (loadingState is LoadingState.Loading) {
LinearProgressIndicator(
color = MaterialTheme.colorScheme.onPrimary,
modifier = Modifier
.height(6.dp)
.fillMaxWidth(),
)
}
WebView(
state = state,
modifier = Modifier.fillMaxSize(),
navigator = navigator,
webViewJsBridge = jsBridge,
)
LaunchedEffect(state, navigator) {
snapshotFlow { state.loadingState }
.filter { it is LoadingState.Finished }
.collect {
navigator.evaluateJavaScript(
"""
try {
// Select the element in the DOM
const preElement = document.querySelector('pre');
if (preElement) {
// Extract the JSON content from the element
const jsonResponse = preElement.innerText;
console.log("Extracted JSON response:", jsonResponse);
// Send the response to the native side using the bridge
window.JsBridge.postMessage('login', jsonResponse);
} else {
console.error(" element not found");
}
} catch (e) {
console.error('Error extracting JSON response:', e);
}
""".trimIndent()
)
}
}
}
}
}
class LoginMessageHandler : IJsMessageHandler {
override fun handle(
message: JsMessage,
navigator: WebViewNavigator?,
callback: (String) -> Unit
) {
println("LoginMessageHandler handle: $message")
Logger.i {
"Greet Handler Get Message: $message"
}
//val param = processParams(message)
callback(message.params)
}
override fun methodName(): String {
return "login"
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... he-webview
Многоплатформенность Kotlin: как извлечь значение JSON, загруженное в WebView? ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Многоплатформенность Kotlin: как извлечь значение JSON, загруженное в WebView?
Anonymous » » в форуме Android - 0 Ответы
- 14 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Многоплатформенность Kotlin: как извлечь значение JSON, загруженное в WebView?
Anonymous » » в форуме Android - 0 Ответы
- 23 Просмотры
-
Последнее сообщение Anonymous
-