我正在尝试重新发送用户验证电子邮件。我读了一些帖子,建议只需将电子邮件地址设置为相同的值并保存用户对象 - 所以我尝试了这样:
PFUser.currentUser().email = String(PFUser.currentUser().email)
PFUser.currentUser().saveInBackgroundWithBlock {}
这不起作用。它永远不会解雇验证邮件。有没有更好的办法?可能会发生什么。我可以在保存块中确认非零用户和成功。
答案 0 :(得分:8)
你已经找到了Parse方便的电子邮件验证行为中最粗糙的边缘之一:-)重新发送电子邮件验证使用通过将电子邮件重置为用户当前地址,保存和验证将重复工作被发送。目前,此行为无效。
只有当服务器上的电子邮件地址发生变化时才会发送验证电子邮件,这是一种可怕的行为。这意味着您需要将电子邮件地址设置为其他内容,保存,成功时将其更改回用户原始电子邮件,然后再次保存。诀窍是第一次更改并保存,将发送验证邮件。
我做了什么,这太可怕了,但这是我发现的唯一一种不向临时/无效地址发送随机验证电子邮件的方法,就是清空用户的电子邮件,保存,设置它再次,并保存。如果设置/保存正确的地址失败,则会导致处于中间状态,但这是我发现的唯一解决方法。代码如下。
let user = PFUser.currentUser()
let email = user.email
user.email = ""
user.saveInBackgroundWithBlock { result, error in
if let e = error {
// Handle the error
return
}
user.email = email
user.saveInBackgroundWithBlock {result, error in
if let e = error {
// If you have an error here you're screwed, as your user now has a blank email address
return
}
}
}
让用户拥有无法挽回的电子邮件地址的方法可能是在用户对象上有一个“oldEmail”地址字段,然后将其设置为他们的电子邮件,然后将他们的电子邮件设置为“”,然后保存,因此,如果第一次保存成功而第二次保存失败,您可以尝试通过设置email = oldEmail来恢复。
答案 1 :(得分:7)
在我的情况下,我正在复制电子邮件的小写字符串版本作为用户登录的用户名。因此,电子邮件地址的实际大写并不重要。由于电子邮件地址的域始终是不区分大小写的,我正在翻转它的第一个字符并保存。这没有第二次保存并且没有可能的边缘状态。
// Flip the capitlization of the first letter of the email
// Get the domain separator
NSRange atRange = [user.email rangeOfString:@"@"];
// If we couldn't find it we need to back out
if (atRange.location == NSNotFound) {
completion(NO, [NSError errorWithDomain:@"com.myapp.error"
code:0
userInfo:@{NSLocalizedDescriptionKey : NSLocalizedString(@"User Has Invalid Email Message", @"User Has Invalid Email Message") } ]);
return;
}
// Get the flip range and character
NSRange flipRange = NSMakeRange(atRange.location + 1, 1);
NSString *flipChar = [user.email substringWithRange:flipRange];
// Flip the capitlization
flipChar = ([[NSCharacterSet uppercaseLetterCharacterSet] characterIsMember:[flipChar characterAtIndex:0]]) ?
[flipChar lowercaseString] : [flipChar uppercaseString];
// Updated and save
user.email = [user.email stringByReplacingCharactersInRange:flipRange withString:flipChar];
[user saveInBackgroundWithBlock:^(BOOL succeeded, NSError * _Nullable error) {
if (succeeded) {
// Handle Success
}
else{
// Handle failure
}
}];
如果您需要保持大写,您可以随时在云代码钩子中修复它。