使用swift和firebase的gidsignin:检查用户是新用户还是返回用户

问题描述 投票:1回答:1

我写了一个应用程序,通过使用谷歌登录包和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

我基本上只想要一个条件,如果用户先前已登录应用程序,则返回true / false,如果这是新用户,则返回相反的条件。


我的视图控制器

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

@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)
    }
  }

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

This solution看起来很有希望,但它只解释了如何用Facebook而不是谷歌。

使用this answer嵌套的if语句if UserDefaults.standard.string(forKey: "uid") != nil && Auth.auth().currentUser != nil {总是返回false。第一个条件是始终返回false的条件,但第二个条件是始终返回true的条件。 (这种情况发生在我多次登录的帐户和全新的帐户)。当我收到dump(UserDefaults.standard)

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

包含checking the last login date with the creation date(newUserRref?.creationDate?.timeIntervalSince1970 == newUserRref?.lastSignInDate?.timeIntervalSince1970)的解决方案总是为我返回false,因此它返回没有用户曾经是新用户。该帖子还有一些其他解决方案我还不完全理解

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

ios swift firebase google-signin gidsignin
1个回答
0
投票

所以这起初工作,但后来停止工作,但newUserRref?.creationDate?.timeIntervalSince1970newUserRref?.lastSignInDate?.timeIntervalSince197几乎完全相同,但它们在大约第3小数位有所不同(一个是可选的(15536​​23223.055),另一个是可选的(15536​​23223.057))

我必须从第三个发布的链接修改解决方案,以包含double类型的扩展,我将其直接放在Sign ViewController类的底部。

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)
    }
© www.soinside.com 2019 - 2024. All rights reserved.