Обзор потока
- Пользователь открывает приложение Flutter
- Нажимает «Вход»
- WebView открывает и загружает внешнюю страницу входа
- Пользователь нажимает «Забыли пароль»
- Второй WebView открывается (также внешний)
- Пользователь вводит свой адрес электронной почты и отправляет форму
- Ожидается: отправляется электронное письмо для сброса пароля
На iOS запрос на шаге 6 никогда не доходит до сервера.
WebView просто не отправляет запрос — ни перенаправления, ни сетевого трафика.
На Android все работает отлично. Кроме того, очень сложно генерировать журналы любого типа, просто при отправке запроса ничего не происходит.
Похоже, что открытие второго WebView на iOS вызывает переключение контекста, которое нарушает запрос.
Внешний провайдер утверждает, что его серверная часть + страницы настроены правильно, а поскольку Android работает, проблема, похоже, на стороне iOS/WebView/Flutter.
Что мы пробовали
- Первоначально использовалось oauth2_client → та же проблема
- Перешел на flutter_appauth → та же проблема
- Проверенные URL-адреса перенаправления и схемы обратного вызова
- Очистка DerivedData Xcode
- Сброс папки сборки iOS (очистка флаттера, удаление /ios/Pods, установка модуля)
- Проверено iOS права
- Пыталась настроить постоянное хранилище и файлы cookie между обоими WEbView (например, prepreEphemeralSession).
Кто-нибудь сталкивался с проблемой, когда iOS блокирует запросы от второго WebView, особенно когда поток включает аутентификацию или отправку формы, размещенную на внешнем сервере?
Отказ от ответственности: я совершенно новичок во флаттере + auth + ios
Поэтому, если вам нужен какой-либо конкретный код, просто сообщите мне, и я постараюсь предоставить вам всю необходимую информацию.
Код: Выделить всё
Future signInWithUsernamePassword() async {
try {
_authType = AuthType.emailPassword;
AccessTokenResponse tkn = await _authProvider.authorizeAndExchangeCode(
clientId: AuthType.emailPassword.clientId,
redirectUrl: "com.example.app://oauth2redirect",
discoveryUrl: "https://example.com/auth/realms/yourrealm/.well-known/openid-configuration",
scopes: const ["openid", "profile", "roles"],
preferEphemeral: false,
);
await _handleTokenResponse(tkn);
} catch (e) {
FlutterError.presentError(FlutterErrorDetails(exception: e));
print("Error: " + e.toString());
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... -from-seco
Мобильная версия