2017-03-08 60 views
0

我在Mac上使用Ionic 2構建。firebase.d.ts iOS工作,但Android凍結

Your system information: 

Cordova CLI: 6.4.0 
Ionic Framework Version: 2.0.0-rc.4 
Ionic CLI Version: 2.1.18 
Ionic App Lib Version: 2.1.9 
Ionic App Scripts Version: 1.0.0 
ios-deploy version: Not installed 
ios-sim version: Not installed 
OS: macOS Sierra 
Node Version: v6.9.4 
Xcode version: Xcode 8.2.1 Build version 8C1002 

我有一個應用程序,我一直在發展。當我通過iOS的Xcode構建應用程序時,一切正常。

但是,當我嘗試爲Android構建它時,它會生成android-debug.apk文件,但是如果我嘗試在模擬器(Android Studio)或我的Android手機上運行它,它似乎會加載但凍結。

我有3頁。它會加載初始頁面,我可以導航到第二頁面,但只要嘗試導航到第三頁面,導航就會凍結。這隻發生在Android。

因此,我認爲我的第三頁可能會導致導航中斷。

如果有人有任何建議,或者可以建議我如何調試此,我將不勝感激您的幫助。

這是第三個頁面(在構造函數中初始警報不會被調用):

login.ts

import { Component, Inject, forwardRef } from '@angular/core'; 
import { NavController, AlertController, Platform, Loading, LoadingController } from 'ionic-angular'; 
import { FirebaseAuth, AuthProviders, FirebaseAuthState } from 'angularfire2'; 
import { JobModel } from '../model/jobModel'; 
import { PersonModel } from '../model/personModel'; 
import { UtilityService } from '../utils/utilityService'; 
import { PersonService } from '../service/personService'; 
import { LoginEmailPage } from '../loginemail/loginemail'; 
import { PersonPage } from '../person/person'; 
import { PersonUserService } from '../person/personUserService'; 

@Component({ 
    templateUrl: 'login.html' 
}) 
export class LoginPage { 
    public jobModel: JobModel; 
    public personModel: PersonModel; 
    public fireAuth: firebase.auth.Auth; 
    public utilityService: UtilityService = null; 
    public loading: Loading = null; 
    public authState: FirebaseAuthState = null; 

    constructor(@Inject(forwardRef(() => UtilityService)) utilityService, public nav: NavController, public auth: FirebaseAuth, public alertCtrl: AlertController, public personService: PersonService, public platform: Platform, public loadingCtrl: LoadingController, public personUserService: PersonUserService) { 
    alert('login.ts constructor'); 
    this.fireAuth = firebase.auth(); 
    this.utilityService = utilityService; 
    this.utilityService.logout(this.auth, this.fireAuth); 
    this.auth.subscribe((authState: FirebaseAuthState) => { 
     this.authState = authState; 
    }); 
    } 

    setUpUser(firebaseAuthState: FirebaseAuthState, provider_id: number): Promise<PersonModel> { 
    return new Promise<PersonModel>((resolve) => { 
     let provider: AuthProviders = firebaseAuthState.provider; 
     if (!provider) { 
     provider = provider_id; 
     } 
     this.personService.getPersonByUidAndProvider(window.localStorage.getItem('uid'), provider).then((personModel: PersonModel) => { 
     if (personModel && personModel.id) { 
      this.personModel = personModel; 
      this.personModel.provider = provider; 
      if (!this.personModel || !this.personModel.uid) { 
      this.fireAuth.onAuthStateChanged((user: firebase.User) => { 
       if (user) { 
       this.newPerson(user, firebaseAuthState, provider_id).then((data: PersonModel) => { 
        this.personModel = data; 
        resolve(this.personModel); 
       }); 
       } 
      }); 
      } else { 
      this.personModel.avatarFirebase = window.localStorage.getItem('photoURL'); 
      this.personModel.lastAccessDate = new Date().getTime(); 
      let user: firebase.User = this.fireAuth.currentUser; 
      if (!user) { 
       let loginPromise: Promise<PersonModel> = this.utilityService.login(this.personModel, this.authState.auth, this.nav, this.auth, this.fireAuth, false); 
       if (loginPromise) { 
       loginPromise.then((person: PersonModel) => { 
        resolve(person); 
       }); 
       } else { 
       resolve(null); 
       } 
      } else { 
       let loginPromise: Promise<PersonModel> = this.utilityService.login(this.personModel, user, this.nav, this.auth, this.fireAuth, false); 
       if (loginPromise) { 
       loginPromise.then((person: PersonModel) => { 
        resolve(person); 
       }); 
       } else { 
       resolve(null); 
       } 
      } 
      } 
     } else { 
      let user: firebase.User = this.fireAuth.currentUser; 
      if (this.authState && this.authState.auth) { 
      this.newPerson(this.authState.auth, firebaseAuthState, provider_id).then((personData: PersonModel) => { 
       this.personModel = personData; 
       resolve(this.personModel); 
      }); 
      } else if (user) { 
      this.newPerson(user, firebaseAuthState, provider_id).then((personData: PersonModel) => { 
       this.personModel = personData; 
       resolve(this.personModel); 
      }); 
      } else { 
      this.doAlert('Logging into Firebase unsuccessful'); 
      console.info('Logging into Firebase unsuccessful', this.authState, user); 
      } 
     } 
     }, (error) => { 
     console.error('Error getting personModel for uid: ' + window.localStorage.getItem('uid'), error); 
     }); 
    }); 
    } 

    newPerson(user: firebase.User, firebaseAuthState: FirebaseAuthState, provider_id: number): Promise<PersonModel> { 
    return new Promise<PersonModel>(resolve => { 
     this.personModel = new PersonModel(); 
     if (user && user.email) { 
     this.personModel.emailAddress = user.email; 
     } else if (firebaseAuthState && firebaseAuthState.auth && firebaseAuthState.auth.email) { 
     this.personModel.emailAddress = firebaseAuthState.auth.email; 
     } else if (this.fireAuth && this.fireAuth.currentUser && this.fireAuth.currentUser.email) { 
     this.personModel.emailAddress = this.fireAuth.currentUser.email; 
     } else { 
     console.error('Firebase current user is null, so cannot get email address and cannot save user to RESTful Service.', this.fireAuth); 
     } 
     this.personModel.uid = window.localStorage.getItem('uid'); 
     this.personModel.displayName = window.localStorage.getItem('displayName'); 
     this.personModel.avatarFirebase = window.localStorage.getItem('photoURL'); 
     this.personModel.provider = firebaseAuthState.provider; 
     this.personModel.lastAccessDate = new Date().getTime(); 
     if (!this.personModel.provider) { 
     this.personModel.provider = provider_id; 
     } 
     if (this.personModel.emailAddress) { 
     this.utilityService.getPersonLocations(this.personModel).then((person: PersonModel) => { 
      return this.savePerson(person, user).then((person: PersonModel) => { 
      resolve(person); 
      }); 
     }).catch((error) => { 
      console.info('Saving person, but location not found'); 
      return this.savePerson(this.personModel, user).then((person: PersonModel) => { 
      resolve(person); 
      }); 
     }); 
     } 
    }); 
    } 

    savePerson(personModel: PersonModel, user: firebase.User): Promise<PersonModel> { 
    return new Promise<PersonModel>(resolve => { 
     this.personModel = personModel; 
     this.personService.savePerson(this.personModel).then((personModel: PersonModel) => { 
     this.utilityService.login(personModel, user, this.nav, this.auth, this.fireAuth, true).then((person: PersonModel) => { 
      resolve(person); 
     }); 
     }); 
    }); 
    } 

    signIn(firebaseAuthState: FirebaseAuthState, provider_id: number) { 
    let emailVerified: boolean = false; 
    let user: firebase.User = this.fireAuth.currentUser; 
    if (user) { 
     if (user.emailVerified) { 
     emailVerified = true; 
     } 
    } else { 
     if (firebaseAuthState.auth && firebaseAuthState.auth.emailVerified) { 
     emailVerified = true; 
     } 
    } 
    if (firebaseAuthState && firebaseAuthState.uid) { 
     this.setUpUser(firebaseAuthState, provider_id).then((personModel: PersonModel) => { 
     if (personModel && emailVerified) { 
      this.nav.setRoot(PersonPage, { 
      personModel: personModel, 
      fromLogin: true 
      }).then(() => { 
      this.loading.dismiss(); 
      }); 
     } 
     }); 
    } 
    window.setTimeout(() => { 
     this.loading.dismiss(); 
    }, 6000); 
    } 

    // sanityCheck(firebaseAuthState: FirebaseAuthState): void { 
    // if (firebaseAuthState && firebaseAuthState.auth && !firebaseAuthState.auth.emailVerified) { 
    //  this.personService.getPersonByUid(firebaseAuthState.uid).then((personModel: any) => { 
    //  if (!personModel) { 
    //   console.error('RDS PersonModel does not exist for Firebase User ', personModel, firebaseAuthState); 
    //   firebaseAuthState.auth.delete().then(() => { 
    //   console.info('Firebase User deleted', firebaseAuthState); 
    //   }); 
    //  } else if (personModel.ok === false) { 
    //   console.error('RDS PersonModel does not exist for Firebase User ', personModel, firebaseAuthState); 
    //   firebaseAuthState.auth.delete().then(() => { 
    //   console.info('Firebase User deleted', firebaseAuthState); 
    //   }); 
    //  } 
    //  }).catch((error) => { 
    //  console.error('RDS PersonModel does not exist for Firebase User ', firebaseAuthState); 
    //  firebaseAuthState.auth.delete().then(() => { 
    //   console.info('Firebase User deleted', firebaseAuthState); 
    //  }); 
    //  }); 
    // } 
    // } 

    loginGoogle(): void { 
    this.loading = this.loadingCtrl.create({ 
     content: 'Please wait...' 
    }); 
    this.loading.present(); 
    this.personUserService.init(this.nav, this.personModel, null, this.loading); 
    if (this.platform.is('cordova')) { 
     this.platform.ready().then(() => { 
     this.personUserService.loginGoogleCordova().then((data: FirebaseAuthState) => { 
      this.signIn(data, AuthProviders.Google); 
     }); 
     }); 
    } else { 
     this.personUserService.loginGoogleBrowser().then((data: FirebaseAuthState) => { 
     this.signIn(data, AuthProviders.Google); 
     }); 
    } 
    } 

    loginFacebook(): void { 
    alert('login.ts loginFacebook'); 
    this.loading = this.loadingCtrl.create({ 
     content: 'Please wait...' 
    }); 
// this.loading.present(); 
    this.personUserService.init(this.nav, this.personModel, null, this.loading); 
    alert('login.ts loginFacebook just initialised personUserService'); 
    if (this.platform.is('cordova')) { 
    alert('login.ts loginFacebook cordova'); 
     this.platform.ready().then(() => { 
    alert('login.ts loginFacebook ready'); 
     this.personUserService.loginFacebookCordova().then((data: FirebaseAuthState) => { 
    alert('login.ts loginFacebook loginFacebookCordova done'); 
      this.signIn(data, AuthProviders.Facebook); 
     }); 
     }); 
    } else { 
    alert('login.ts loginFacebook not cordova'); 
     this.personUserService.loginFacebookBrowser().then((data: FirebaseAuthState) => { 
    alert('login.ts loginFacebook loginFacebookBrowser done'); 
     this.signIn(data, AuthProviders.Facebook); 
     }); 
    } 
    } 

    loginEmail() { 
    this.nav.push(LoginEmailPage); 
    } 

    doAlert(msg: string) { 
    let alert = this.alertCtrl.create({ 
     title: 'Login', 
     subTitle: msg, 
     buttons: ['Dismiss'] 
    }); 
    alert.present(); 
    } 

} 

UPDATE

發現是什麼原因造成它會崩潰,但我不知道爲什麼。

在構造函數中:

alert('personUserService.ts constructor'); 
alert('personUserService.ts constructor firebase = '+firebase); 
    this.fireAuth = firebase.auth(); 
alert('personUserService.ts constructor this.fireAuth = '+this.fireAuth); 
    this.auth.subscribe((authState: FirebaseAuthState) => { 
     this.authState = authState; 
    }); 

第一個提醒被調用,然後將其凍結。這意味着firebase對象正在導致它凍結。

這個作品iOS,所以不知道爲什麼它不在Android

firebase是在node_modules/firebase/server-auth-node/文件夾中引用firebase.d.ts的命名空間。

+0

您可以通過在app.ts將警報在不同的地方進行調試或針點的問題,其中的應用開始。另外,看看'platform.ready()'是否一切正常。 –

+0

我可以添加警報,謝謝你。我不知道如何在Android Studio中添加調試點。如果我在Android Studio中嘗試調試,我會得到:'無法啓動編譯:輸出路徑未指定給模塊「myapp」。在配置項目中指定輸出路徑.' – Richard

+0

我無法幫助您瞭解Android Studio的調試情況。沒做過我自己。警報似乎適用於我。另外,請檢查'platform.ready()'。 –

回答

0

我做了以下內容,我所有的問題就走了:

1)ionic platform rm android 2)ionic platform add android