Как постоянно хранить файлы cookie API на Android?Android

Форум для тех, кто программирует под Android
Anonymous
Как постоянно хранить файлы cookie API на Android?

Сообщение Anonymous »

Я разрабатываю приложение, основная функция которого — общаться с веб-сервером, когда пользователь нажимает кнопку, а затем периодически в фоновом режиме, пока приложение может быть закрыто. В настоящее время я пытаюсь выяснить, как сохранить файлы cookie таким образом, чтобы они сохранялись при закрытии и открытии приложения. Для этого я пытаюсь использовать хранилище данных настроек (следуя основам Android), но когда я пытаюсь собрать потоки, чтобы получить их в виде обычных строк для размещения в запросах API, функция блокируется на неопределенный срок.

Код: Выделить всё

class CookieRepository (private val dataStore : DataStore) {

private companion object {
val CSRF = stringPreferencesKey("csrf")
val SESSION = stringPreferencesKey("session")
}

val TAG = "COOKIE_REPOSITORY"
suspend fun saveCsrf(csrfToken : String) {
dataStore.edit { preferences -> preferences[CSRF] = csrfToken }
}

suspend fun saveSession(sessionToken : String) {
dataStore.edit {preferences -> preferences[SESSION] = sessionToken}
}

val csrfToken : Flow = dataStore.data
.catch {
if(it is IOException) {
Log.e(TAG, "Error reading preferences.", it)
emit(emptyPreferences())
} else {
throw it
}
}
.map{ preferences -> preferences[CSRF] ?: "No Cookie" }

val sessionToken : Flow = dataStore.data
.catch {
if(it is IOException) {
Log.e(TAG, "Error reading preferences.", it)
emit(emptyPreferences())
} else {
throw it
}
}
.map{ preferences -> preferences[SESSION] ?: "No Cookie" }

suspend fun updateCookiesFromHeaders(headers : Headers) {
for (header in headers) {
if (header.first == "Set-Cookie") {
val name = header.second.split("=")[0]
val value = header.second.split("=")[1].split(";")[0]
if (name == "csrftoken") {
saveCsrf(value)
}
else if (name == "sessionid") {
saveSession(value)
}
}
}
}

suspend fun getCookiesAsString() : String {
var cookieString = ""
csrfToken.collect { if (it != "No Cookie") {cookieString = cookieString.plus("csrftoken=$it;")} }
sessionToken.collect { if (it != "No Cookie") {cookieString = cookieString.plus("sessionid=$it;")} }
return cookieString.dropLast(1)
}

suspend fun getCsrfToken() : String {
var token = ""
csrfToken.collect {token = it}
return token
}

}
CookieRepository создается в моем Application.kt, внедренном в мою модель представления, которая вызывает функции updateCookiesFromHeaders ,

Код: Выделить всё

getCookiesAsString
и getCsrfToken перед выполнением запроса.


Подробнее: https://stackoverflow.com/questions/799 ... on-android

Вернуться в «Android»