1

Firebase メール検証中に URL ダイナミック リンクを介してアプリを起動するときに、最初のコントローラーでビューを表示し、UILabel を設定する必要があります。

私が抱えている問題は、ラベルが初期化されていないため、プロセス中にアプリがクラッシュすることです。多くのアプローチを試しましたが、アプリが既に開いている場合でも、ダイナミック リンクを開くときにビューを表示してラベルを設定することができません。

シーンデリゲート

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {

    if let link = userActivity.webpageURL?.absoluteString
    {
     
        if Auth.auth().isSignIn(withEmailLink: link) {

            Config().verifyEmail(link: link)
        }
    }
}

AppDelegate

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

var errorText: String?
var errorType: Bool?

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

ViewController

func loadErrorInfo()
{
    let appDelegate = UIApplication.shared.delegate as! AppDelegate

    if let eText = appDelegate.errorText, let eType = appDelegate.errorType {
        errorCall(message: eText, error: eType)
    } else {
        errorBox.isHidden = true
    }
}
func errorCall(message: String, error: Bool)
{
    if error {
        self.errorLabel.textColor = UIColor.yellow
        self.errorLabel.text = message
        self.errorBox.isHidden = false
        self.errorBox.shake()
    } else {
        self.errorLabel.textColor = UIColor.white
        self.errorLabel.text = message
        self.errorBox.isHidden = false
        self.errorBox.shakeL()
    }
}

カスタム構成 NSObject クラス

import UIKit
import FirebaseAuth

open class Config: NSObject {

public func verifyEmail(link: String)
{
    var email = ""; var password = ""
    if let x = UserDefaults.standard.object(forKey: "Email") as? String { email = x }
    if let y = UserDefaults.standard.object(forKey: "Password-\(email)") as? String { password = y }
    
    if password != "" && email != ""
    {
        Auth.auth().signIn(withEmail: email, link: link) { (user, error) in
        if let use = user, error == nil
        {
            Auth.auth().currentUser?.updatePassword(to: password) { (error) in
                  if let error = error
                  {
                        print(error)
                    let appDelegate = UIApplication.shared.delegate as! AppDelegate
                    appDelegate.errorText = error.localizedDescription
                        appDelegate.errorType = true
                    ViewController().loadErrorInfo()
                  }
                  else
                  {
                    print(use, "Logged In")
                    let appDelegate = UIApplication.shared.delegate as! AppDelegate
                    appDelegate.errorText = "\(use) Logged In"
                    appDelegate.errorType = false
                    ViewController().loadErrorInfo()
       
                  }
               }
            }
        }
    }
}

}

他の方法が機能するかどうかはわかりません。要約すると、電子メールのダイナミック リンクをクリックした後、初期コントローラーであるメインの ViewController で UILabel を変更したいと考えています。現時点では、コントローラーが既に初期化されていても、UILabel が設定されていないため、どのアプローチでもクラッシュします。

4

1 に答える 1