の使用に問題がありますwebview
ログインフロー用。ユーザーが最初に開いたページに自分の情報を入力するだけで、すべてが正常に機能します。onPageFinished へのコールバックを取得し、URL からトークンを抽出してそこから処理を進めます。しかし、最初に開いたページで、ユーザーがクリックして facebook を使用してログインすると、facebook のログイン ページにリダイレクトされ、この URL がロードされた onPageFinished でコールバックを受け取っているようにも見えます。ただし、ユーザーがこの方法で FB に移動した場合、onPageFinished で行っている他の非同期呼び出しは実行されません。ログイン資格情報をすぐに入力すれば、すべて問題ありません。FB を使用すると、すべてが停止します。関連するログはなく、いかなる種類のクラッシュもありません。以下は、これがどのように見えるかを示しています (以下は有効な Java でさえなく、コンパイルできないことはわかっていますが、私は.
SomeAwesomeName extends Fragment {
View onCreateView {
Webview webView = new WebView;
webview.setWebViewClient(new MyClient)
return webiew;
}
class MyClient extends WebViewClient {
onPageFinished(String url) {
if(url.contains("/user/login/done")) { //user hit login on the initially opened page and we're good
//grab a token from that url and do some asynchronous call
SomeClass.fetchSomethingAsync("what to fetch", new CallBack() {
void done(data) {
startActivity(new Intent("bla bla"))
getActivity.finish
}
})
}
}
}
}
上記は少しわかりにくいかもしれないので、問題を次のように要約します。どの場合でも、「user/login/done」を含む URL に移動すると、ログイン フローは終了します。ユーザーが電子メール/パスワードの使用を選択するか、Facebook の使用を決定するかにかかわらず、ログイン フローは常に同じ場所で終了します。
フローは、次の 2 つの可能性のいずれかになります。
最初の可能性 (これが機能する) フラグメントが表示される -> WebView が URL をロードする -> ユーザーが電子メール/パスワードでログインする -> onPageFinished が呼び出される -> トークンが抽出される -> onPageFinished 内で非同期呼び出しをトリガーし、コールバックが発生したときに新しいアクティビティを開始する呼ばれた。
2番目の可能性 フラグメントが表示される-> WebViewがURLをロードする->ユーザーがクリックしてFaceBookログインを使用し、FBにリダイレクトする-> onPageFinishedが呼び出される->トークンが抽出される->その後...何もない。
ここでの唯一の違いは、ユーザーが Web ページに関して 1 レベル深くナビゲートしたことです。それ以外は、一体何が起こっているのか理解できません。FB ログインが成功した後に onPageFinished が実際に呼び出されるという事実は、これをさらに奇妙にします。onPageFinished が呼び出され、渡された URL からトークンを取得できますが、onPageFinished は実行を停止します。アプリで ANR やクラッシュは発生せず、ログに怪しいものはありません。
編集
実際、onPageStarted で渡された URL の 1 つに次のものが含まれていることがわかりました。
Ferror_reason%3Duser_denied%26error%3Daccess_denied%26error_description%3DThe%2Buser%2Bdenied%2Byour%2Brequest
そのため、webview/webviewclient で奇妙なことが起こっています。何かご意見は?
編集
FB の「ユーザーがアクセスを拒否しました」というエラーが表示されても、ログインを処理するためにそのインターフェイスに接続している Web サービスは、実際には FB のトークンを取得できます。ログに FB エラーが表示され、続いて Web サービスへのリダイレクトが user/login/done?token=FACEBOOK_TOKEN_HERE に返されます。
しかし、それでも、新しいアクティビティを開始するために onPageFinished 内で実行を継続できないようです。新しいスレッドですべてを実行したり、実行可能ファイルを getActivity().runOnUiThread に投稿したりしましたが、どれも役に立たないようです。