IndexedDB 不适用于 Android 应用程序Microsoft团队



我开发了一个SharePoint Web部件,我正在团队中用作应用程序。通过此Web部件,我调用外部网站(http://xxxx/example.html)用indexedDB存储一些数据。

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

如果我尝试在Chrome、Firefox的团队中使用此应用程序。。。桌面应用程序一切正常,但我在尝试将该应用程序与Teams的android应用程序一起使用时发现了一个错误。

我可以做些什么来使用Teams的android应用程序中的indexedDB?

这是外部站点的代码(http://xxxx/example.html)我正在从WebPart:调用

如果我试图在团队的Android应用程序中使用该应用程序,我会出现以下错误:

'允许访问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>

有人能给我什么线索吗?

问候!

Android在WebView上加载应用程序。WebView不如全面的浏览器功能强大/功能丰富。必须看看WebViews是否支持indexDB。

https://caniuse.com/#search=indexDB.这表明IndexDB支持Android 81+的Chrome。您可以查看网络视图中显示的chrome版本。这再次依赖于移动设备。(使用chrome://inspect从笔记本电脑chrome浏览器,而您的手机是可调试和连接的(

它也可以是权限。不过我不确定。我在某处读到这篇文章。为了排除这种可能性,你可以尝试手动向团队应用程序提供存储权限,以验证它是否解决了问题吗?

如果这些都没有帮助,很可能是WebView问题,或者团队必须采取措施启用indexDB(如果WebView支持的话(。

最新更新