gidsignin с swift и firebase: проверка, является ли пользователь новым или вернувшимся пользователем - PullRequest
1 голос
/ 26 марта 2019

Я написал приложение, которое регистрирует пользователя, используя пакет входа в 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

Я просто хочу условие, которое возвращает истину / ложь, если пользователь ранее вошел в приложение, и возвращает противоположное, если это новый пользователь.


My View Controller

Это мой контроллер представления входа, который является первым видом, видимым в моем приложении.Прямо сейчас Он настроен на печать «нового пользователя», если пользователь никогда не входил в приложение, и «старого пользователя», если это возвращающийся пользователь.

@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, а не с Google.

С этот ответ вложенный if statment if UserDefaults.standard.string(forKey: "uid") != nil && Auth.auth().currentUser != nil { всегда возвращает false.Первое условие всегда возвращает false, но второе условие всегда возвращает true.(Это происходит с учетными записями, в которые я захожу несколько раз, и с новыми учетными записями).Когда я dump(UserDefaults.standard) получаю

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

Решение, которое включает проверку последней даты входа в систему с датой создания (newUserRref? .CreationDate? .TimeIntervalSince1970 == newUserRref? .LastSignInDate?.timeIntervalSince1970) всегда возвращал false для меня, поэтому возвращалось, что ни один пользователь никогда не был новым пользователем.В этом посте есть некоторые другие решения, которые я не совсем понимаю

Документация не объясняет, как проверить, является ли это первым входом в систему, я вижу только то, чтокак создать нового пользователя или войти в систему существующего пользователя, но я не знаю, как узнать, когда и что делать.

1 Ответ

0 голосов
/ 26 марта 2019

Итак, сначала это сработало, но потом перестало работать, но newUserRref?.creationDate?.timeIntervalSince1970 и newUserRref?.lastSignInDate?.timeIntervalSince197 почти идентичны, но они отличаются примерно на третьем десятичном знаке (один будет необязательным (1553623223.055), а другой - необязательным (1553623223.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)
    }
...