离子本机存储在iOS上不起作用

时间:2018-10-11 08:59:12

标签: ios typescript cordova ionic3 ionic-native

我在一个带有身份验证系统的项目中使用了Ionic 3。当用户想要连接时,我使用本机存储。它可以在Android上运行,但在iOS上,即使使用platform.ready(),也可以将我重定向到登录屏幕。我看到几个人是一个类似的问题,但没有答案,所以我想知道某人是否面临着相同的问题,以及他是否找到了解决方案。这是我的代码:

this.plt.ready().then(() => {
                            this.nativeStorage.setItem('userStorage', { stayConnected: (typeof this.stayConnected == "undefined" || this.stayConnected == false ? '' : 'stayConnected'), userId: (result as any).id, userLogin: (result as any).login })
                                .then(
                                    () => {
                                        this.loader.dismiss();
                                        this.navCtrl.setRoot(HomePage);
                                    },
                                    error => {
                                        this.loader.dismiss();
                                        this.presentToast(this.languageLogin.error, 3000, "bottom");
                                    }
                                )
                        }, 
                        error => {
                            this.loader.dismiss();
                            this.presentToast(this.languageLogin.error, 3000, "bottom");
                        });

感谢您的回答。

3 个答案:

答案 0 :(得分:1)

我会将2个函数storeUser()和getUser()放入同一提供者UserService中,如下所示 然后将UserService添加到所需的任何页面的构造函数中。 它适用于IOS,Android和Web

import {Storage} from '@ionic/storage';
import {Observable} from 'rxjs/Observable';
@Injectable()
export class UserService {
 constructor(private storage: Storage){}
 public storeUser(userData): void {
     this.storage.set('userData', userData);
}
public getUser(): Observable<any>
  return Observable.fromPromise(this.storage.get('userData').then((val) => {
            return !!val;
        }));
}

答案 1 :(得分:0)

是的,在使用离子本机存储插件时遇到了问题。所以我转向javascript窗口localStorage属性,它的工作原理完全正常。

将数据保存到localStorage的语法:

localStorage.setItem("key", "success");

从localStorage读取数据的语法:

var lastname = localStorage.getItem("key");

从localStorage删除数据的语法:

localStorage.removeItem("key");

现在您可以使用此属性编写代码,如下所示-

if (lastname == "success"){
   this.navCtrl.setRoot(HomePage);
} else{
 alert("Not matched")
}

答案 2 :(得分:0)

您在platform.ready()里面,这很好。存储软件包还具有您可能要利用的.ready(),它专门检查存储本身是否已准备就绪。如果此程序在启动时运行,则可能有不错的存储空间正在初始化。

此外,这开始陷入一些疯狂的诺言链混乱之中。我建议潜入异步/等待。类似于下面的(未经测试的)代码。

try{
    await this.plt.ready();
    await this.nativeStorage.ready();
    let stayConnectedValue = (this.stayConnected) ? 'stayConnected' : '';
    await this.nativeStorage.setItem('userStorage', { stayConnected: stayConnectedValue , userId: (result as any).id, userLogin: (result as any).login });
    this.navCtrl.setRoot(HomePage);
}
catch(err){     
    this.presentToast(this.languageLogin.error, 3000, "bottom");
}
finally{
    this.loader.dismiss();
}