Если вы хотите использовать пароль без логина (это 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
}
}