2015-05-12 7 views
2

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

PFUser.currentUser().email = String(PFUser.currentUser().email) 
PFUser.currentUser().saveInBackgroundWithBlock {} 

Это не работает. Это никогда не сбрасывает письмо с подтверждением. Есть ли способ лучше? Что может быть? Я могу подтвердить пользователя и успех без изменений в блоке сохранения.

+0

Чтобы инициировать проверку почты, требуется изменить значение поля электронной почты. Поэтому просто установите несколько фиктивных писем сначала, а затем оригинальное письмо. – Amit

ответ

8

Вы нашли один из грубейших ребер в удобном электронной почте поведении проверки PARSE в :-) Resending электронной проверки используемых для работы путем сброса электронной почты для пользователей текущего адреса, сохранение и проверка будет отправлена. В настоящее время это поведение не работает.

Подтверждение электронной почты отправляется только в случае изменения адреса электронной почты на сервере, что является ужасным поведением. Это означает, что вам нужно установить адрес электронной почты на что-то еще, сохранить, когда это будет успешным, изменить его на исходное электронное письмо пользователей и снова сохранить. Хитрость заключается в том, что первое изменение и сохранение отправят электронное письмо с подтверждением.

Что я сделал, и это ужасно, но это единственный способ, который я нашел вокруг этого, который не отправляет случайные письма с проверкой на временные/недействительные адреса, заключается в том, чтобы очистить электронную почту пользователей, сохранить, установить это снова и сохранить. Это приводит к среднему состоянию, в котором вы попадаете, если настройка/сохранение правильного адреса завершается с ошибкой, но это единственный обходной путь, который я нашел. Код ниже.

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.

+0

Возможно, вы можете сделать 'user.email = email; user.saveEventually(); 'как отказоустойчивость, если есть ошибка? –

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 
    } 
}]; 

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

+1

Блестящее решение для курения – adrian1kat

Смежные вопросы