2017-07-18 8 views
1

Je laisse l'utilisateur connecté en utilisant UserDefaults, mais parfois l'utilisateur est déconnecté sans raison. Quand j'ai débogué ce cas, j'ai trouvé que UserDefault est null!Swift 3 - UserDefaults effacé automatiquement sans raison

Remarque: Je n'efface pas les valeurs sauf si l'utilisateur appuie sur le bouton de déconnexion.

Edit:

Voici un code:

Lorsque l'utilisateur se connecte à, j'enregistrer le jeton à l'aide:

UserDefaults.standard.set("Bearer \(actualJson["access_token"].stringValue)", forKey: "access_token") 
UserDefaults.standard.set("\(actualJson["refresh_token"].stringValue)", forKey: "refresh_token") 
UserDefaults.standard.synchronize() 

Chaque fois que je reçois 401 erreur de serveur (jeton expire) J'en obtiens de nouveaux en utilisant le refresh_token:

AccountService.refreshToken(refreshToken: UserDefaults.standard.object(forKey: "refresh_token") != nil ? UserDefaults.standard.string(forKey: "refresh_token")! : "", callback: { (json) in 

    // set user defaults 
    UserDefaults.standard.set("Bearer \(json["access_token"].stringValue)", forKey: "access_token") 
    UserDefaults.standard.set("\(json["refresh_token"].stringValue)", forKey: "refresh_token") 
    UserDefaults.standard.synchronize() 
}) 

Dans AppDelegate méthode didFinishLaunchingWithOptions:

if UserDefaults.standard.object(forKey: "access_token") != nil && UserDefaults.standard.string(forKey: "refresh_token") != "" { 
      // go to home 
} 

Dans le code précédent, UserDefaults.standard.string(forKey: "refresh_token") est nulle. Bien que je suis sûr que je n'ai pas effacé la valeur

+2

Vous ne pouvez rien faire sans avoir vu de code. Vérifiez si vous avez ajouté du code pour effacer userdefaults dans appdelegate ou dans d'autres fichiers. –

+0

@DSDharma J'ai mis à jour la question – nouf

+1

Peut-être que le résultat du serveur n'est pas bon lorsque vous rafraîchissez le jeton, comme 'json [" refresh_token "]. StringValue' est nul. –

Répondre

-1

La chaîne NSUserDefaults pourrait également être surchargée par un pointeur dangling. Si un objet autoreleased est assigné à un endroit qui est censé être conservé, et que la chaîne NSUserDefaults est allouée à sa place, lorsque le "propriétaire" de l'objet libéré essaye de le libérer, il libère cette chaîne à la place.