ионное родное хранилище не работает на iOS - PullRequest
0 голосов
/ 11 октября 2018

Я использую 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 голосов
/ 11 октября 2018

Я бы поместил 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;
        }));
}
0 голосов
/ 11 октября 2018

Вы внутри 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();
}
0 голосов
/ 11 октября 2018

Да, у меня возникли проблемы при использовании ионных плагинов для хранения данных.Поэтому я обратился к javascript Window LocalStorage Property, и он работает совершенно нормально.

Синтаксис для сохранения данных в 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")
}
...