Во-первых, я видел, что здесь есть другие потенциально связанные проблемы, однако предложенные решения не решили мою проблему.
Чтобы попытаться помочь объяснить проблему, я расскажу о том, чего я пытаюсь достичь; с нашего веб-сайта отправляется электронное письмо с приглашением пользователя зарегистрироваться в нашем клиентском приложении. Ссылка в электронном письме ведет на наш веб-сайт, сохраняет код активации, а затем перенаправляет на страницу Google Play Store. Как только пользователь загружает приложение, а затем просматривает вводные экраны, он пытается найти код активации, загружая WebView. Здесь что-то идет не так, в настоящее время он не может найти / получить доступ к локальному хранилищу, чтобы получить код активации.
Вот что у меня сейчас есть:
Перенаправление магазина приложений (первая ссылка в письме)
<html><head></head><body>
<script type='text/javascript'>
// The activation code goes in this url
localStorage.setItem('url', '" + constructedUrl + "');
setTimeout(function() {
window.location.href='BACK TO OUR SITE' }, 30000);
setTimeout(function() {
window.location.href='GOOGLE PLAY STORE PAGE' }, 500);
</script>
</body></html>
Разрешения в AndroidManifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Попытка получить код активации
cookieWebView.getSettings().setJavaScriptEnabled(true);
cookieWebView.getSettings().setAppCacheEnabled(false);
cookieWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
cookieWebView.getSettings().setDomStorageEnabled(true);
cookieWebView.setWebViewClient(new MyWebClient());
// Call the AppActivate.html file.
cookieWebView.loadUrl(ServerCommunications.getRedirectUrl());
cookieWebView.setWebChromeClient(new WebChromeClient() {
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
Log.d("MyApplication", consoleMessage.message() + " -- From line "
+ consoleMessage.lineNumber() + " of "
+ consoleMessage.sourceId());
return false;
}
});
Активация приложения (загружается из вышеуказанного WebView)
<head>
<title></title>
</head>
<body>
<script>
var appUrl = localStorage.getItem('url');
console.log("URL is ");
console.log(appUrl);
if (appUrl) {
localStorage.removeItem('url');
location.href = appUrl;
} else {
location.href = "OUR SCHEME://?token=0";
}
</script>
</body>
</html>
То, что я вижу, когда приложение пытается активировать, - это следующие 2 строки:
09-18 09:06:30.151 4948-4948/our.namespace D/MyApplication: URL is -- From line 10 of https://OURWEBSITE/AppActivate.html
09-18 09:06:30.152 4948-4948/our.namespace D/MyApplication: null -- From line 11 of https://OURWEBSITE/AppActivate.html
Это показывает, что либо значение не было установлено в локальном хранилище, либо к нему нет доступа. Я знаю, что он был сохранен, потому что, если я перехожу по указанному выше URL-адресу из стандартного браузера на своем устройстве Android, он дает мне ожидаемое значение.
Я не могу понять, упускаю ли я какие-либо скрытые настройки или это просто невозможно. Я считаю, что включил все, что связано с разрешениями или настройками для WebView, как это предлагается в других ответах на возможные связанные вопросы. Если это поможет, я тестирую на телефоне BlackView Android 6.0.
Есть ли что-то очевидное, что я упускаю?
For obvious security reasons, your application has its own cache, cookie store etc.—it does not share the Browser application's data. Cookies are managed on a separate thread, so operations like index building don't block the UI thread. Follow the instructions in CookieSyncManager if you want to use cookies in your application.
- person lukaleli   schedule 18.09.2017