Войдите с помощью ссылки для проверки электронной почты Firebase - PullRequest
0 голосов
/ 14 сентября 2018

Я проверяю электронную почту, используя Firebase.Я настроил все вещи и отправил ссылку для проверки.

Проблема в том, что когда я нажимаю на ссылку для проверки, открывается мое приложение, и я получаю ссылку в методе AppDelegate.Но по какой-то причине я не могу войти по этой ссылке.Вот мой код

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
    let handled = DynamicLinks.dynamicLinks().handleUniversalLink(userActivity.webpageURL!) { (dynamiclink, error) in
        if let DeepLinkUrl = dynamiclink?.url?.absoluteString {
            if DeepLinkUrl.contains("verifyEmail") {
                if Auth.auth().isSignIn(withEmailLink: DeepLinkUrl) {
                    Auth.auth().signIn(withEmail: SBUserSetting.getVerificationEmail() ?? "", link: DeepLinkUrl ) { (user, error) in
                        print("user", user)
                        print("error", error)
                    }
                }
            }
        }
    }
    return handled
}

Auth.auth().isSignIn() всегда возвращает false

У вас есть идея, что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Если вы хотите использовать пароль без логина (это https://firebase.google.com/docs/auth/ios/email-link-auth#verify_link_and_sign_in),, тогда вы не можете использовать преобразование из URL-адреса в DynamicLink. Вам нужно только передать необработанный URL-адрес в ваш метод, как этот.

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    if let webpageUrl = userActivity.webpageURL {
        if Auth.auth().isSignIn(withEmailLink: webpageUrl.absoluteString) {

            // Saved email locally before, where you send verification, so you don't need to ask the user for it again
            // if they open the link on the same device.
            if let emailToVerify = UserDefaults.standard.string(forKey: "Email") {
                Auth.auth().signIn(withEmail: emailToVerify, link: webpageUrl.absoluteString) { (user, error) in
                    if let error = error as NSError? {
                        print(error.localizedDescription)
                    } else {
                        // User is logged in
                    }
                }
            }
        }
    }
    return true
}

Но если вы хотите использовать метод sendEmailVerification , вам нужно это:

func sendEmailVerification() {
    let actionCodeSettings = ActionCodeSettings()
    actionCodeSettings.url = URL(string: "https://yourdomain.com")
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = true
    actionCodeSettings.setIOSBundleID(Bundle.main.bundleId) // Budle identifier of your application

    Auth.auth().currentUser?.sendEmailVerification(with: actionCodeSettings, completion: { error in
        if let error = error as NSError? {
            print(error.localizedDescription)
        } else {
            // inform user about sending verification email
        }
    })
}

Затем вы можете обработать поступившее письмо с классом DynamicLink следующим образом:

func handleDynamicLink(_ url: URL?) -> Bool {
    guard let url = url else { return false }
    // Here don't know, which method will work, so I handle both for sure :-)

    if !DynamicLinks.dynamicLinks().handleUniversalLink(url, completion: { dynamicLink, error in
        if let dynamicLink = dynamicLink {
            if let oobCode = dynamicLink.url?.getQueryString(parameter: "oobCode") {
                Auth.auth().applyActionCode(oobCode) { error in
                    if let error = error as NSError? {
                        print(error.localizedDescription)
                    } else {
                        // Email was successfully verified
                    }
                }
            }
        } else {
            // Handle error
        }
    }) {
        if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) {
            if let oobCode = dynamicLink.url?.getQueryString(parameter: "oobCode") {
                Auth.auth().applyActionCode(oobCode) { error in
                    if let error = error as NSError? {
                        print(error.localizedDescription)
                    } else {
                        // Email was successfully verified
                    }
                }
            }
        } else {
            // handle error
        }
    }
    return false
}

Вот мой собственный метод расширения URL getQueryString для отделения компонента от URL.

extension URL {

    func getQueryString(parameter: String) -> String? {
        if let urlComponents = URLComponents(string: self.absoluteString) {
            return urlComponents.queryItems?.filter({ item in item.name == parameter }).first?.value
        }
        return nil
    }
}
0 голосов
/ 17 сентября 2018

Проверьте это: https://firebase.google.com/docs/auth/custom-email-handler. Глубокая ссылка будет содержать параметр запроса oobCode.Вам нужно будет проанализировать это и затем использовать applyActionCode для завершения проверки.Документы ориентированы на веб-реализацию, но должны быть совместимы с iOS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...