我正在使用Ionic来构建iOS和Android应用程序。我想在用户首次登录后存储用户记录,以便他们在关闭应用程序后不必再次登录。因此,在应用程序启动时,它会根据表中是否有用户记录来检查它们是否“已登录”。如果未登录(他们第一次运行该应用程序,或稍后单击“注销”),则应进入登录页面。
在 app.component.ts
中this.platform.ready().then(() => {
this.registerBackButton();
this.statusBar.styleDefault();
this.sqlStorageService.initializeDatabase().then(()=> {
this.sqlStorageService.isLoggedIn().then(loggedIn => {
this.loader.dismiss();
this.splashScreen.hide();
if (loggedIn){
this.rootPage = HomePage;
}else{
this.rootPage = LoginPage;
}
});
});
在 sqlStorageService 中:
initializeDatabase()
{
return this.sqlite.create({name: 'data.db', location: 'default' }).then(db => {
this.db = db;
return this.db.executeSql('CREATE TABLE IF NOT EXISTS CurrentUser(userName text primary key, firstName text, lastName text, bearerToken text, claims text)', [])
.then(data => {console.log("initialize database complete")})
})
}
isLoggedIn():Promise<boolean>{
return this.get().then(data => {
return data != null;
})
}
get() : Promise<IAppUserAuthorization> | null{
return this.db.executeSql('SELECT userName, firstName, lastName, bearerToken, claims FROM CurrentUser', [])
.then(data => {
if (data.rows.length == 0){
return null;
}
let user: IAppUserAuthorization =
{
userName: data.rows.item(0).userName,
firstName: data.rows.item(0).firstName,
lastName: data.rows.item(0).lastName,
bearerToken: data.rows.item(0).bearerToken,
isAuthenticated: data.rows.item(0).isAuthenticated,
claims: JSON.parse(data.rows.item(0).claims)
}
return user;
})
}
对用户进行认证
return this.db.executeSql('insert or replace into CurrentUser(userName, firstName, lastName, bearerToken, claims) values(?, ?, ? , ?, ?)',
[appUser.userName, appUser.firstName, appUser.lastName, appUser.bearerToken, JSON.stringify(appUser.claims)])
.then(data => {
return JSON.parse(data.rows.item(0).value);
});
当我部署到android设备时,这一切工作正常。我是第一次登录。然后关闭该应用程序...然后重新打开该应用程序,然后我进入首页。
当我部署到任何iOS设备时,我是第一次登录。然后关闭应用程序..然后重新打开应用程序,然后我进入登录页面。
我想指出的是,在登录iOS设备并通过身份验证之后。记录存储在数据库中,我可以从代码的任何其他部分访问表中的数据,它可以按预期工作。仅当我关闭应用程序并重新打开它时,它才起作用。似乎找不到数据库(或找不到该表中的数据)
我已经为此三天了。我敢肯定它确实有些微妙的东西,但我不明白为什么它可以完美地在android而非iOS上运行