1

我编写了一个应用程序,通过使用 google 登录包和 firebase 登录用户。我想写一些功能

if the user has signed into the app using google previously
   then take them straight to the main ViewController 
otherwise they must be signing in for the first time
   then bring to a view controller to create a profile

我基本上只想要一个条件,如果用户以前登录过应用程序,则返回真/假,如果这是新用户,则返回相反的情况。


我的视图控制器

这是我的登录视图控制器,这是我的应用程序中可见的第一个视图。现在它只设置打印“新用户”,如果用户从未登录过应用程序,如果这是一个返回用户,则打印“老用户”。

@objc(SignInViewController)
class SignInViewController: UIViewController, GIDSignInUIDelegate{

  @IBOutlet var signInButton: GIDSignInButton!

  var handle: AuthStateDidChangeListenerHandle?

  override func viewDidLoad() {
    super.viewDidLoad()
    GIDSignIn.sharedInstance().uiDelegate = self
    handle = Auth.auth().addStateDidChangeListener() { (auth, user) in
        if user != nil {
            MeasurementHelper.sendLoginEvent()
            dump(UserDefaults.standard)

            //This is the part which I need help with/////////////////////
            if this user has logged in previously
                print("old user")
                self.performSegue(withIdentifier: Constants.Segues.SignInToFp, sender: nil)
            }else{
                print("new user")
                self.performSegue(withIdentifier: Constants.Segues.SignInToFp, sender: nil)
            }
            ////////////////////////////////////////////////////////////

        }
    }
  }

  deinit {
    if let handle = handle {
        Auth.auth().removeStateDidChangeListener(handle)
    }
  }

其他对我不起作用的解决方案

这个解决方案看起来很有希望,但它只解释了如何使用 Facebook 而不是谷歌。

有了这个答案,嵌套的 if 语句if UserDefaults.standard.string(forKey: "uid") != nil && Auth.auth().currentUser != nil {总是返回 false。第一个条件是始终返回为假的条件,而第二个条件是始终返回为真的条件。(这发生在我多次登录的帐户和全新的帐户上)。当dump(UserDefaults.standard)我收到

- <NSUserDefaults: 0x2825dd140> #0
  - super: NSObject

包括检查上次登录日期和创建日期的解决方案(newUserRref?.creationDate?.timeIntervalSince1970 == newUserRref?.lastSignInDate?.timeIntervalSince1970)总是为我返回 false,因此它返回没有用户曾经是新用户。那篇文章还有其他一些我不完全理解的解决方案

该文档并没有真正解释如何检查这是否是第一次登录,我只能看到它说如何创建新用户或登录现有用户,但我不知道我怎么知道什么时候做什么。

4

1 回答 1

0

所以这首先有效,但后来停止工作,但newUserRref?.creationDate?.timeIntervalSince1970几乎newUserRref?.lastSignInDate?.timeIntervalSince197相同,但它们在小数点后第三位不同(一个是可选的(15536​​23223.055),另一个是可选的(15536​​23223.057))

我不得不修改第三个发布链接中的解决方案,以包括对 double 类型的扩展,我将其直接放在 SignInViewControllerClass 的底部。

extension Double
{
    func truncate(places : Int)-> Double
    {
        return Double(floor(pow(10.0, Double(places)) * self)/pow(10.0, Double(places)))
    }
}

然后我用来检查用户是新用户还是旧用户的嵌套 if 语句是

    if newUserRref?.creationDate?.timeIntervalSince1970.truncate(places: 2) == newUserRref?.lastSignInDate?.timeIntervalSince1970.truncate(places: 2){
        print("new user")
        self.performSegue(withIdentifier: Constants.Segues.SignInToFp, sender: nil)
    }else{
        print("old user")
        self.performSegue(withIdentifier: Constants.Segues.SignInToFp, sender: nil)
    }
于 2019-03-26T18:15:31.010 回答