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 が設定されていないため、どのアプローチでもクラッシュします。