【问题标题】:ionic native storage does not work on iOS离子原生存储在 iOS 上不起作用
【发布时间】:2019-03-16 07:18:06
【问题描述】:

我在我的一个带有身份验证系统的项目中使用 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");
                        });

感谢您的回答。

【问题讨论】:

    标签: ios typescript cordova ionic3 ionic-native


    【解决方案1】:

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

    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;
            }));
    }
    

    【讨论】:

    • 感谢您的回答,我现在管理复选框,因为我习惯于检查缓存中的信息。
    【解决方案2】:

    是的,我在使用 ionic 本机存储插件时遇到了问题。所以我转向 javascript Window 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")
    }
    

    【讨论】:

      【解决方案3】:

      您在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();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-15
        • 1970-01-01
        • 2018-12-24
        • 1970-01-01
        • 2018-05-18
        • 1970-01-01
        • 2019-05-26
        • 2018-05-26
        相关资源
        最近更新 更多