IndexedDB не работает с приложением Android для Microsoft Teams - PullRequest
0 голосов
/ 05 мая 2020

Я разработал SharePoint WebPart, который я использую как приложение в Teams. Из этой веб-части я вызываю внешний сайт (http://xxxx/example.html) для хранения некоторых данных с indexedDB.

 public async render() {
      this.domElement.innerHTML = `<iframe src="http://xxxx/example.html?token=xxxxxxxx"/>`;
 }

Если я попытаюсь использовать это приложение в Teams из Chrome, Firefox ... и с настольным приложением все работает нормально, но я обнаружил ошибку при попытке использовать приложение с приложением android для Teams.

Что я могу сделать для работы с indexedDB из приложения android для Teams?

Это код внешнего сайта (http://xxxx/example.html), который Я вызываю из WebPart:

Если я пытаюсь использовать приложение в приложении Android для Teams, у меня появляется следующая ошибка:

'Это необходимо для правильное функционирование приложения, чтобы разрешить доступ к IndexedDB. '

В других случаях: настольное приложение, использующее навигаторы ... работает нормально. С моей точки зрения, это связано с тем, как приложение Android обрабатывает indexedDB.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Example</title>
</head>
<body>

<script>

  var tableName = '_test';
  var key = 'a2B2MSmQa1';
  var mydb;
  var entry = getEntry();
  var stringEntry = JSON.stringify(entry);

  function getEntry() {
    // prepare authentication info
    var token = findGetParameter('token');
    var user = getUserFromJwt(token);
    console.log('Received request to log in with token: ' + token + ' and user: ' + user);

    return [{
      "AnyeP3Hy11": btoa(user),
      "bcdW7Sibfo": "",
      "AE1RLE62l3": true,
      "Tx22M4zx51": btoa(token),
      "1l2i483Zx5": false
    }];
  }

  function getUserFromJwt(token) {
    var payload = token.split('.')[1];
    var claims = JSON.parse(atob(payload));

    return claims.email;
  }

  function saveTokenDataWebSql() {
    mydb.transaction(function (t) {
      t.executeSql('select * from ' + tableName + ' where key = ?', [key], function (transaction, data) {
        if (!data.rows.length) {
          // if authentication info doesn't already exists -> create it it
          mydb.transaction(function (t) {
            t.executeSql('insert into ' + tableName + '(key, value) values (?, ?)', [key, stringEntry], goToApp);
            console.log('Inserted entry');
          });
        } else {
          // if authentication info already exists -> replace it
          mydb.transaction(function (t) {
            t.executeSql('update ' + tableName + ' set value = ? where key = ?', [stringEntry, key], goToApp);
            console.log('Updated entry');
          });
        }
      });
    });
  }

  function saveTokenDataIndexedDB(objectStore) {
    objectStore.count(key).onsuccess = function (event) {
      var count = event.target.result;
      if (count !== 0) {
        // if authentication info already exists -> remove it
        objectStore.delete(key).onsuccess = function () {
          // save auth info after deletion
          objectStore.put(entry, key);
        };
      } else {
        // save auth info directly
        objectStore.put(entry, key);
      }

    };
  }

  var indexedDBWay = function () {
    console.log('Using indexedDB option');

    var request = indexedDB.open('__mydb', 2);
    request.onerror = function (event) {
      alert('It is necessary for the correct functioning of the app to allow access to IndexedDB.');
    };
    request.onsuccess = function (event) {
      mydb = event.target.result;

      try {
        console.log('Database opened, checking existence of table');
        var objectStore = mydb.transaction([tableName], 'readwrite')
          .objectStore(tableName);

        console.log('Table exists. Proceeding to save data');
        saveTokenDataIndexedDB(objectStore);

        console.log('All done, going to app');
        goToApp();
      } catch (e) {
        console.log(e);
      }
    };
  };

  var openDatabaseWay = function () {
    console.log('Using openDatabase option');

    mydb = openDatabase('__mydb', '1', 'desc', 1024 * 1024);

    console.log('Database opened, checking existence of table');

    mydb.transaction(function (t) {
      t.executeSql('select * from ' + tableName, [], function (transaction, data) {
        if (data.rows) {
          console.log('Table exists. Proceeding to save data');
          saveTokenDataWebSql();
        } else {
          console.error('App DB not present, go back to app');
          goToApp();
        }
      }, function (t, e) {
        console.log('Error while opening database', e);
        console.log('Creating database');
        createWebSqlDbTable(t, tableName, function () {
          openDatabaseWay();
        }, function (t, e) {
          console.log('Error while creating database. All hope is lost.', e);
          goToApp();
        })
      });
    });
  };

  function createWebSqlDbTable(t, tableName, callback, errorCallback) {
    t.executeSql(
      'CREATE TABLE IF NOT EXISTS ' + tableName +
      '(id INTEGER PRIMARY KEY, key unique, value)',
      [],
      callback,
      errorCallback
    );
  }

  console.log('Trying to save token data');
  var debug = location.search.indexOf('debug') !== -1;
  if(debug){
    debugger;
  }
  if (window.openDatabase) {
    openDatabaseWay();
  } else if (window.indexedDB) {
    indexedDBWay();
  } else {
    console.error('Cannot open database, go back to app');
    goToApp();
  }

</script>

</body>
</html>

Может ли кто-нибудь дать мне подсказку?

С уважением!

1 Ответ

1 голос
/ 02 июня 2020

Android загружает приложение в WebView. WebView не такие мощные / многофункциональные, как полнофункциональные браузеры. Это необходимо увидеть, если WebViews вообще поддерживают indexDB.

https://caniuse.com/#search = indexDB . Это говорит о том, что IndexDB поддерживается Chrome для Android 81+. Вы можете проверить, какая версия chrome отображается в веб-просмотре. Это снова зависит от мобильных устройств. (используйте chrome: // проверяйте с ноутбука chrome браузер, пока ваш мобильный телефон отлажен и подключен)

Это также могут быть разрешения. Хотя я не уверен. Я где-то это читал. Чтобы исключить это, можете ли вы попробовать вручную предоставить разрешение на хранилище приложению команд, чтобы проверить, решает ли оно проблему?

Если это не помогает, скорее всего, это проблема WebView или командам нужно что-то предпринять. включить indexDB, если он поддерживается WebView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...