web-dev-qa-db-ja.com

Firebase Authを使用するとアプリがクラッシュします。理由:「デフォルトのアプリは既に設定されています。」

私は最初のiOSアプリケーションを構築し、Firebaseを使用して認証、データベースなどを処理しています。サインアップ画面を追加し、次のコードを使用して新しいユーザーを作成しました。

FIRAuth.auth()?.createUserWithEmail(emailAddress.text!, password: password.text!, completion: { (user, error) in

        })

ユーザーがサインアップボタンをタップすると、元のログインビューコントローラーに戻す必要があるセグエがあります。ただし、アプリを実行すると、起動画面でハングします。デバッガーの出力は次のとおりです。

2016-06-19 14:35:05.402 unitaskr[4386:82981] Configuring the default app.
2016-06-19 14:35:05.413 unitaskr[4386:] <FIRAnalytics/INFO> Firebase Analytics     v.3200000 started
2016-06-19 14:35:05.414 unitaskr[4386:] <FIRAnalytics/INFO> To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled (see ...)
2016-06-19 14:35:05.419: <FIRInstanceID/WARNING> FIRInstanceID AppDelegate proxy enabled, will swizzle app delegate remote notification handlers. To disable add "FirebaseAppDelegateProxyEnabled" to your Info.plist and set it to NO
2016-06-19 14:35:05.418 unitaskr[4386:] <FIRAnalytics/INFO> Successfully created Firebase Analytics App Delegate Proxy automatically. To disable the proxy, set the flag FirebaseAppDelegateProxyEnabled to NO in the Info.plist
2016-06-19 14:35:05.430 unitaskr[4386:82981] *** Terminating app due to uncaught exception 'com.firebase.core', reason: 'Default app has already been configured.'
*** First throw call stack:
(
0   CoreFoundation                      0x00000001100a8d85   __exceptionPreprocess + 165
1   libobjc.A.dylib                     0x00000001108e7deb objc_exception_throw + 48
2   CoreFoundation                      0x00000001100a8cbd +[NSException raise:format:] + 205
3   unitaskr                            0x000000010b58844d +[FIRApp    configureDefaultAppWithOptions:sendingNotifications:] + 102
4   unitaskr                            0x000000010b588238 +[FIRApp configure] + 302
5   unitaskr                            0x000000010b541f1a _TFC8unitaskr11AppDelegate11applicationfTCSo13UIApplication29didFinishLaunchingWithOptionsGSqGVs10DictionaryCSo8NSObjectPs9AnyObject____Sb + 266
6   unitaskr                            0x000000010b542204 _TToFC8unitaskr11AppDelegate11applicationfTCSo13UIApplication29didFinishLaunchingWithOptionsGSqGVs10DictionaryCSo8NSObjectPs9AnyObject____Sb + 180
7   UIKit                               0x000000010e5bf9ac -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 272
8   UIKit                               0x000000010e5c0c0d -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 3415
9   UIKit                               0x000000010e5c7568 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1769
10  UIKit                               0x000000010e5c4714 -[UIApplication workspaceDidEndTransaction:] + 188
11  FrontBoardServices                  0x00000001127b78c8 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 24
12  FrontBoardServices                  0x00000001127b7741 -[FBSSerialQueue _performNext] + 178
13  FrontBoardServices                  0x00000001127b7aca -[FBSSerialQueue _performNextFromRunLoopSource] + 45
14  CoreFoundation                      0x000000010ffce301 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
15  CoreFoundation                      0x000000010ffc422c __CFRunLoopDoSources0 + 556
16  CoreFoundation                      0x000000010ffc36e3 __CFRunLoopRun + 867
17  CoreFoundation                      0x000000010ffc30f8 CFRunLoopRunSpecific + 488
18  UIKit                               0x000000010e5c3f21 -[UIApplication _run] + 402
19  UIKit                               0x000000010e5c8f09 UIApplicationMain + 171
20  unitaskr                            0x000000010b542a42 main + 114
21  libdyld.dylib                       0x00000001113b692d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

必要に応じて追加情報を提供することができます。できるだけ始めて、できるだけ多くのことを学びたいと思っているので、どんなヘルプ/アドバイスも大歓迎です。すてきな一日を!

33

Messages Extensionに問題がありました:

App Extensionにいる場合、デリゲートはなく、FIRApp.configure()をinitに配置する必要があります。メインViewController(または提案されているviewDidLoad内)。

問題は、メッセージ拡張機能で、ユーザーが拡張機能を開くスレッドで複数のメッセージを押すと、init(またはviewdidLoad)が数回呼び出されるため、FIRApp.configure()が数回呼び出されるためにクラッシュすることです...

私が見つけた解決策は、メインのView Controllerで静的ブールを作成することでした:

    static var isAlreadyLaunchedOnce = false // Used to avoid 2 FIRApp configure

そして、initまたはviewDidLoadでFIRApp.configure()を呼び出す前にテストします。

// Configure Firebase
    // ------------------
    // We check if FIRApp has already been configured with a static var, else it will crash...
    if !MessagesViewController.isAlreadyLaunchedOnce {
        FIRApp.configure()

        MessagesViewController.isAlreadyLaunchedOnce = true
    }

このように、これ以上クラッシュしません。


ああ、私はここで問題を解決するはるかにエレガントな方法を見つけました: iOS拡張機能-致命的な例外:com.firebase.coreデフォルトアプリは既に設定されています

    // Configure Firebase
    // ------------------
    if FIRApp.defaultApp() == nil {
        FIRApp.configure()            
    }

このように静的ではありません;)

44

FIRApp.configure()を2回書いたところ、エラーが修正されたようです。

26

これは、この問題に関する他の解決策です。 1 /以下のように表示される「AppDelegate.Swift」をチェックインします

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    FirebaseApp.configure()
    return true
}

2 /上記のコードから「FirebaseApp.configure()」を削除して

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    return true
}

3 /「AppDelegate.Swift」に以下のコードを追加します

override init() {
    FirebaseApp.configure()
}

4 /「ViewController.Swift」に移動して、コードを追加します

    if FirebaseApp.app() == nil {
        FirebaseApp.configure()
    }

5 /再度ビルドして実行すると動作します。ありがとう!

9
Khoem Vichet

クラス名:AppDelegate + FCMPlugin.m

[FIRApp.configure()];

これをこのメソッドの一番上に置きます

- (BOOL)application:(UIApplication *)application customDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 if(![FIRApp defaultApp]){
    [FIRApp configure];}}
7

AppDelegateのinitメソッドで1回呼び出して構成できます。

override init() {
   // Firebase Init
   FIRApp.configure()
}
6
Ourang-Zeb Khan

誰かがこの問題に出くわした場合に備えて。 firebase sdkでgoogleSignIn sdkを使用する場合。一度設定するだけで済みます。 [[GGLContext sharedInstance] configureWithError: &configureError];または[FIRApp configure]

3
Ian Zhao

Swift 4、

if FirebaseApp.app() == nil {
/// code snippet
}
3
ssowri1

Swift 4の場合

クラッシュに関しても同じ問題がありました。 .plistファイルを使用してFirebaseから参照しようとした場合。

(これで問題が解決しました。)

ViewDidLoadメソッドの外部または内部でこれを書いてみてください:

1. var ref: DatabaseReference!

次に、viewDidLoadメソッド内でそれを参照します。

2. Database.database().reference()

そして今では:

FirebaseApp.configure()

代わりに。