Sano
Sano

Reputation: 53

ionic native storage does not work on iOS

I use Ionic 3 on one of my projects with an authentication system. I use native storage when the user wants to connect. It works on Android but on iOS, it redirects me to the login screen even using platform.ready (). I saw that several people were a similar problem but no answer, so I wanted to know if someone was facing the same problem and if he found a solution. Here is my code:

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

thank you for your answers.

Upvotes: 2

Views: 1760

Answers (3)

BRass
BRass

Reputation: 3838

You are inside a platform.ready(), which is good. The storage package also has a .ready() that you may want to leverage, which specifically checks if storage itself is ready. If this runs at startup there is a decent chance storage is initializing.

Also, this starts to get into some crazy promise chaining messiness. I'd suggest diving into async/await. Something like the (untested) code below.

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

Upvotes: 0

Arun Kumar
Arun Kumar

Reputation: 26

I would put 2 function storeUser() and getUser() into the same provider UserService like belows Then add UserService to the constructor of any pages required. It works for both IOS, Android and 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;
        }));
}

Upvotes: 1

Ajoy Karmakar
Ajoy Karmakar

Reputation: 671

Yes, I have faced issues while using ionic native storage plugins. So I turned to javascript Window localStorage Property and it's working completely fine.

Syntax for SAVING data to localStorage:

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

Syntax for READING data from localStorage:

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

Syntax for REMOVING data from localStorage:

localStorage.removeItem("key");

and now you can write your code with this property, like this -

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

Upvotes: 0

Related Questions