質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.34%

FirebaseでのTwitterログインでabout:blankへ遷移してしまう

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,332

Soul3725

score 20

発生してて解決したい問題

Swiftを用いてSNSログイン制のチャットアプリを製作中です。

①Firebaseを用いたTwitter認証でログインした後[連携アプリを認証]ボタンを押す。
本来ならその後アプリ画面へ戻るはずだがabout:blankへ遷移してしまう。

②認証画面は通ったはずだがAuthenticationのユーザーに登録されない。

上記2点の問題の解決策をご教授いただけると幸いです。

挙動

ログイン動作を実行するsignInWithTwitter()を実行するボタンを押す→
Firebase側のローディング→Twitterログイン画面へ遷移→Twitterにログイン→
[連携アプリを認証]ボタンを押す→Firebase側のローディング→about:blankに遷移

記述について

基本的にはFirebaseの公式ドキュメントに沿って実装しました。
iOSでTwitterを使用して認証する

コードや設定など(最終更新11/9 7:57)

LogInViewController.swift

import UIKit
import Firebase
import FirebaseAuth

class LogInViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    var provider = OAuthProvider(providerID: "twitter.com")

    func signInWithTwitter(){
        provider.getCredentialWith(nil) { credential, error in
          if error != nil {
            // Handle error.
            print("error")
          }
          if credential != nil {
            Auth.auth().signIn(with: credential!) { authResult, error in
              if error != nil {
                // Handle error.
                print("error")
              }
                print("success")
                self.performSegue(withIdentifier: "toMain", sender: nil)
              // User is signed in.
              // IdP data available in authResult.additionalUserInfo.profile.
              // Twitter OAuth access token can also be retrieved by:
              // authResult.credential.accessToken
              // Twitter OAuth ID token can be retrieved by calling:
              // authResult.credential.idToken
              // Twitter OAuth secret can be retrieved by calling:
              // authResult.credential.secret
            }
          }
        }
    }

    @IBAction func pushTwitter(_ sender: Any) {
        signInWithTwitter()
    }

}


AppDelegate.swift

import UIKit
import Firebase

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    override init() {
       super.init()
       FirebaseApp.configure()
    }


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        return true
    }

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        return true
    }


}


TwitterAPI
【Callback URLs】
https://{Firebaseプロジェクト名}.firebaseapp.com/__/auth/handler

URL Types
イメージ説明

Info.plist
イメージ説明

プロジェクト
イメージ説明

コンソール
アプリを起動してからTwitterログインしてabout:blankに遷移するまで

2019-11-09 08:18:45.113207+0900 GTchat[7627:2228391]  - <AppMeasurement>[I-ACS036002] Analytics screen reporting is enabled. Call +[FIRAnalytics setScreenName:setScreenClass:] to set the screen name or override the default screen class name. To disable screen reporting, set the flag FirebaseScreenReportingEnabled to NO (boolean) in the Info.plist
2019-11-09 08:18:45.156983+0900 GTchat[7627:2228392] 6.11.0 - [Firebase/Analytics][I-ACS023007] Analytics v.60103000 started
2019-11-09 08:18:45.157294+0900 GTchat[7627:2228392] 6.11.0 - [Firebase/Analytics][I-ACS023008] To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled (see http://goo.gl/RfcP7r)
2019-11-09 08:18:45.217640+0900 GTchat[7627:2228392] 6.11.0 - [GoogleUtilities/AppDelegateSwizzler][I-SWZ001014] App Delegate does not conform to UIApplicationDelegate protocol.


書いてない部分で解決に必要な要素がありましたら追記します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

再現しました🙆‍♀️
iOS13から実装されたUIWindowSceneDelegateが悪さをしていそうです。特に使わないのであれば、

  1. SceneDelegate.swiftをProjectから削除
  2. AppDelegate内の関連する箇所でエラーが出るのでコードを削除
  3. Info.plistのApplication Scene Manifestを削除
  4. AppDelegateのプロパティにUIWindowを追加

AppDelegateはたぶんこんな感じ

class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        FirebaseApp.configure()
        return true
    }
}

これでうまく動くかと思います👍

OAuthProviderを作るタイミング次第でクラッシュするかもしれないので、FirebaseApp.configure()が先に動くようにOAuthProviderを作成してください✌️

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/09 11:34

    FirebaseApp.configure()はdidFinishLaunchingWithOptions内で実行することが求められているので元にに戻して、ViewControllerの OAuthProviderの扱いをこうするとどうでしょう〜

    ```
    class LogInViewController: UIViewController {
    var provider: OAuthProvider?

    override func viewDidLoad() {
    super.viewDidLoad()
    provider = OAuthProvider(providerID: "twitter.com")
    }
    ```

    キャンセル

  • 2019/11/09 11:54

    無事画面が戻り認証が完了したようです!
    本当にありがとうございました!

    キャンセル

  • 2020/12/16 01:48

    1.SceneDelegate.swiftをProjectから削除したら,2.AppDelegate内の関連する箇所でエラーが出ませんでした。
    また、この状態で起動させたら、画面が真っ暗になりました。
    よかったら、解決方法を教えていただけたら、嬉しいです。

    キャンセル

+1

まずはURL Typeが登録されているか確認してみてください🙋‍♀️

URL TypesはTARGETSのInfo内にあります。URL Schemesに指定する値はGoogleService-Info.plistのREVERSED_CLIENT_IDです。
![イメージ説明

次にAppDelegateで以下の関数を定義している場合はtrueが返っていることを確認してみてください😉

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    return true
}

最後にこちらに記載しているFirebaseAppDelegateProxyEnabledがNOになっている場合はYESに変更するか、Info.plistから外してみてください😌

お役に立てれば幸いです🙏

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/08 18:31

    回答ありがとうございます!
    URL Typesは公式のドキュメントを読み実装する際に追加済みでした。
    AppDelegateの関数定義ですが上記の関数は定義されていなかったので追記しました。
    最後のFirebaseAppDelegateProxyEnabledはInfo.plistにはありませんでした。

    以上3つを確認したのち実行しましたがやはり認証後画面が戻ってきません。。。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る