Доступ к локальному хранилищу в WebView

Во-первых, я видел, что здесь есть другие потенциально связанные проблемы, однако предложенные решения не решили мою проблему.

Чтобы попытаться помочь объяснить проблему, я расскажу о том, чего я пытаюсь достичь; с нашего веб-сайта отправляется электронное письмо с приглашением пользователя зарегистрироваться в нашем клиентском приложении. Ссылка в электронном письме ведет на наш веб-сайт, сохраняет код активации, а затем перенаправляет на страницу 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.

Есть ли что-то очевидное, что я упускаю?


person Bijington    schedule 18.09.2017    source источник
comment
Любые значения, установленные в веб-браузере Android по умолчанию в локальном хранилище/файлах cookie, не будут отображаться в WebView в вашем приложении. Это совершенно другой экземпляр браузера.   -  person lukaleli    schedule 18.09.2017
comment
Мы смогли добиться этого на iOS с помощью SafariViewController. Думаю, я ожидал, что Android будет менее ограничивающим. Считаете ли вы, что можно было бы добиться чего-то подобного с помощью файлов cookie и получить к ним доступ из нашего приложения?   -  person Bijington    schedule 18.09.2017
comment
Что бы я предложил, возможно, это использовать глубокую ссылку? Таким образом, процесс будет выглядеть следующим образом: 1. сохраните код активации, как и раньше, в локальном хранилище 2. когда пользователь загружает ваше приложение и проходит процесс регистрации, включите некоторую кнопку (или сделайте это автоматически), которая открывает веб-страницу в системе. браузер. 3. Теперь у вас есть доступ к локальному хранилищу, в котором вы сохранили код активации. 4. На веб-сайте укажите кнопку с глубокой ссылкой, в URL-адресе которой есть код активации. 5. Пользователь нажимает ее и возвращается в ваше приложение, где вы можете получить код активации из Intent. Имеет ли это смысл?   -  person lukaleli    schedule 18.09.2017
comment
Да, это имеет смысл, спасибо. Я действительно не хотел выходить из приложения, чтобы получить эту информацию, но это может быть единственный способ. Этот процесс был реализован в исходном приложении (iOS), чтобы пользователю было проще зарегистрироваться, а переключение между приложением и браузером просто заставляет его чувствовать себя плохо. Возможно, нам придется найти другой возможный подход. Спасибо хоть   -  person Bijington    schedule 18.09.2017
comment
Вы также можете поиграться с реферальными ссылками (ищите: Google Play Campaign Measurement). Вы можете получить доступ к реферальному номеру в своем приложении после загрузки приложения из Google Play Store. В этом случае вы можете не обращаться к каким-либо значениям локального хранилища и выходить из своего приложения.   -  person lukaleli    schedule 18.09.2017
comment
Обязательно посмотрю на это спасибо! Если это решит, я дам вам знать, чтобы вы могли требовать ответа   -  person Bijington    schedule 18.09.2017
comment
@lukaleli этот подход, безусловно, подходит для использования! У меня есть некоторые проблемы с его работой в сборке релиза, но это, скорее всего, проблема с моей реализацией. С удовольствием одобряю ответ, основанный на нем.   -  person Bijington    schedule 21.09.2017
comment
Большой! добавит ответ, а затем вам одобрить :)   -  person lukaleli    schedule 21.09.2017


Ответы (1)


Согласно developer.android.com/reference/android/webkit/WebView.html< /а>:

По очевидным причинам безопасности ваше приложение имеет собственный кеш, хранилище файлов cookie и т. д. — оно не использует данные приложения браузера. Файлы cookie управляются в отдельном потоке, поэтому такие операции, как построение индекса, не блокируют поток пользовательского интерфейса. Следуйте инструкциям в CookieSyncManager, если вы хотите использовать файлы cookie в своем приложении.

Я бы предложил, возможно, использовать глубокие ссылки. Поток будет примерно таким:

  1. Сохраните код активации, как и раньше, в локальном хранилище.
  2. Когда пользователь загружает ваше приложение и проходит процесс адаптации, включите кнопку (или сделайте это автоматически), которая открывает веб-страницу в системном браузере.
  3. Теперь у вас есть доступ к локальному хранилищу, в котором вы сохранили код активации.
  4. На веб-сайте укажите кнопку с глубокой ссылкой, которая имеет код активации в URL-адресе.
  5. Пользователь нажимает на нее и возвращается в ваше приложение, где вы можете получить код активации из Intent.

Если вы не хотите нарушать UX, выходя из приложения, возможно, вам стоит взглянуть на реферальные ссылки (ищите: Google Play Campaign Measurement). Вы можете получить доступ к реферальному номеру в своем приложении после загрузки приложения из Google Play Store. В этом случае вы можете не обращаться к каким-либо значениям локального хранилища и выходить из своего приложения.

person lukaleli    schedule 21.09.2017
comment
Я пошел дальше и воспользовался предложением по измерению кампании. Я передал соответствующую информацию при перенаправлении в Play Store, а затем использовал эту информацию после запуска приложения. - person Bijington; 21.09.2017