Firbaseを使用してIonic 3アプリでGoogle Sign-inを実装しています。私は正常にnative Google Plus Cordova pluginを使用して、Angular Fire 2を使用してFirebaseに資格情報でログインできました。ここに私のコードは次のとおりです。Ionicの約束が決して解決しない
public loginWithGoogle(): Promise<any> {
return new Promise((resolve, reject) => {
let loginPromise: Promise<any>;
if (this.isMobile()) {
loginPromise = new Promise((resolve, reject) => {
this.googleplus.login({
'webClientId': '--------.apps.googleusercontent.com',
'offline': true
})
.then(res => {
this.afAUth.auth.signInWithCredential(firebase.auth.GoogleAuthProvider.credential(res.idToken))
.then(firebaseRes => {
resolve(firebaseRes);
})
.catch(err => {
reject(err);
});
})
.catch(err => {
reject(err);
});
});
} else {
loginPromise = this.afAUth.auth.signInWithPopup(new firebase.auth.GoogleAuthProvider()) as Promise<any>;
}
loginPromise
.then(res => {
console.log('login promise done: ' + JSON.stringify(res));
const user: User = {
uid: res.user.uid,
email: res.user.email,
displayName: res.user.displayName
};
resolve(user);
});
});
}
そして、私のログインページで、それへの呼び出し:
this.auth.loginWithGoogle()
.then(res => {
console.log('success login !!!!!');
})
.catch(err => {
console.log('error login !!!!!');
});
しかし、私はXcodeのでのiOSにデプロイするとき、私はコンソール出力を見ることができます:
2017-06-11 11:32:01.384130 MyApp[2634:842028] login promise done: {"uid":"...","displayName":"...","photoURL":"..."...}
約束は決して解決しません!私はZoneJSを手動で使用しようとしましたが失敗しました:
private zone;
public loginWithGoogle(): Promise<any> {
this.zone = new NgZone({});
...
this.zone.run(() => {
resolve(user);
});
});
});
}
結果は同じです。詳細については、ブラウザでログインが正常に動作します。
私の悪いです!十分な注意を払わなかった。私は自分の答えを取り除いた。私の提案は、 'loginWithGoogle()'を2つの関数に分割することです。一方はモバイルでのログインを処理し、もう1つはブラウザのログイン(apartneの分離)を処理します。次に、2つのうちのどちらかを呼び出す前にプラットフォームチェックを行います。これによりコードのデバッグが容易になり、コードを読んでいる人にとっても読みやすいようになります。 – robbannn
ご協力ありがとうございます!私はオブザーバブルでコードを書き直しました。そして私も問題を見つけました!認証情報を持つFirebaseの署名は、ポップアップでサインインするのと同じオブジェクトインターフェイスを返しません...問題は、ポップアップでサインインするときに存在するres.userにアクセスしていたのですが、クレデンシャルでサインインするときに存在しませんでした。後者の場合、プロパティ 'uid'、' email'、 'displayName'はオブジェクトのルートに直接あります:' res.uid'、 'res.email' ...これは開発者の視点からはかなり誤解を招く。 – user5365075