Аутентификация электронной почты без пароля в Firebase не открывает приложение на iOS - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь и терплю неудачу, чтобы реализовать классную функцию входа по электронной почте через Firebase. Я успешно настроил отправку ссылки по электронной почте. Тем не менее, я не могу получить ссылку на электронную почту, чтобы открыть приложение. Он просто открывает страницу предварительного просмотра, как будто он не может открыть приложение.

Я протестировал настроенную мной динамическую ссылку и могу заставить ее открыть приложение на устройстве. Я просто не могу получить ссылку электронной почты, чтобы сделать то же самое.

Код в моем приложении:

func sendFirebaseEmailLink() {

    let actionCodeSettings = ActionCodeSettings.init()

    // userEmail comes from a textField
    let email = userEmail

    actionCodeSettings.url = URL.init(string: String(format: "https://<myappname>.firebaseapp.com/?email=%@", email))
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = true
    actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!)

    Auth.auth().sendSignInLink(toEmail: email,
        actionCodeSettings: actionCodeSettings) { error in

        if let error = error {
            print(error.localizedDescription)
            return
        }
        else {
            UserDefaults.standard.set(email, forKey: "Email")
            print("email sent to user")
        }
    }
}

Когда я говорю, что я успешно получил динамическую ссылку, чтобы открыть приложение, я имею в виду, когда я перехожу по ссылке, которую я создал (mylinkname.page.link/emaillogin) на устройстве, на котором установлено приложение, он открывает приложение. Из-за этого и [этого полезного видео о Firebase] [1] при настройке динамической ссылки кажется, что у меня есть правильные детали, и проблема с кодом, но я новичок в этом, поэтому я не уверен .

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

1 Ответ

0 голосов
/ 18 апреля 2019

Я наконец понял это.Код был в порядке.Это была проблема, связанная с динамической связью.У меня была настроена пара ссылок в Firebase, потому что мне нужно было создать новый Bundle ID в одной точке.Когда я удалил старую в Firebase, ссылка электронной почты начала работать.

Она появляется на моем сайте ассоциации приложений, как это, и странным образом, хотя я удалила старую ссылку, но, по крайней мере, она работаетсейчас!

{"applinks": {"apps": [], "details": [{"appID": "TEAMID.com.OLDBUNDLEIDENTIFIER.APPNAME", "paths": ["NOT / /*","/*"]], enj"appID":"TEAMID.com.NEWBUNDLEIDENTIFIER.APPNAME","paths":["NOT / / "," /"]}]}}

ОБНОВЛЕНИЕ: Ниже приведен мой полный код для ввода пароля без электронной почты.Мне было больно собирать вместе, используя документацию, так что, надеюсь, это избавит вас от проблем.

Основные шаги, предполагающие, что вы понимаете основы настройки Firebase.

1) Настройка динамического соединения с помощью Видеоурок Firebase .

2) Код в View Controller:

var userEmail: String?
var link: String?

func sendFirebaseEmailLink() {

    let actionCodeSettings = ActionCodeSettings.init()
    let email = userEmail
    actionCodeSettings.url = URL.init(string: String(format: "https://<myappname>.page.link/emaillogin/?email=%@", email!))
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = true
    actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!)

    Auth.auth().sendSignInLink(toEmail: email!,
        actionCodeSettings: actionCodeSettings) { error in

        if let error = error {
            print(error.localizedDescription)
            return
        }
        else {
            UserDefaults.standard.set(email, forKey: "Email")
            print("email sent to user")
        }

        // TODO: Notify user to check email and click the link.
    }
}

// Sign in user after they clicked email link called from AppDelegate
@objc func signInUserAfterEmailLinkClick() {

    // Get link url string from the dynamic link captured in AppDelegate.
    if let link = UserDefaults.standard.value(forKey: "Link") as? String {
        self.link = link
    }

    // Sign user in with the link and email.
    Auth.auth().signIn(withEmail: userEmail!, link: link!) { (result, error) in

        if error == nil && result != nil {

            if (Auth.auth().currentUser?.isEmailVerified)! {
                print("User verified with passwordless email")

                // TODO: Do something after user verified like present a new View Controller

            }
            else {
                print("User NOT verified by passwordless email")

            }
        }
        else {
            print("Error with passwordless email verfification: \(error?.localizedDescription ?? "Strangely, no error avaialble.")")
        }   
    }
}

3) Код в AppDelegate

// For Passwordless Email Login to Handle Dynamic Link after User Clicks Email Link
func application(_ application: UIApplication, continue userActivity: NSUserActivity,
                 restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {

    if let incomingURL = userActivity.webpageURL {
        print("Incoming URL is \(incomingURL)")

        // Parse incoming
        let linkHandled = DynamicLinks.dynamicLinks().handleUniversalLink(incomingURL) { (dynamicLink, error) in

            guard error == nil else {
                print("Found an error: \(error!.localizedDescription)")
                return
            }
            if let dynamicLink = dynamicLink {
                self.handleIncomingDynamicLink(dynamicLink)
            }
        }
        if linkHandled {
            return true
        }
        else {
            // Maybe do other things with dynamic links in future?
            return false
        }
    }
    return false
}

// Handles the link and saves it to userDefaults to assist with login.
func handleIncomingDynamicLink(_ dynamicLink: DynamicLink) {
    guard let url = dynamicLink.url else {
        print("My dynamic link object has no url")
        return
    }
    print("Incoming link parameter is \(url.absoluteString)")

    let link = url.absoluteString
    if Auth.auth().isSignIn(withEmailLink: link) {

        // Save link to userDefaults to help finalize login.
        UserDefaults.standard.set(link, forKey: "Link")

        // Send notification to ViewController to push the First Time Login VC
        NotificationCenter.default.post(
            name: Notification.Name("SuccessfulPasswordlessEmailNotification"), object: nil, userInfo: nil)
    }
}
...