2015-11-26 3 views
0

У меня есть пользовательский объект, который я хотел бы сохранить в данный момент для входа в систему, а также функции, которые позволят пользователю делать такие вещи, как выход из системы, и т. д.Расположение объекта пользователя в iOS (swift)

Следуя различным учебным пособиям и множеству сообщений здесь, я придумал некоторый код, который хорошо работает до сих пор при входе в систему через страницу входа. Вот этот код:

import Foundation 
import UIKit 

// define the protocol for using this class 
protocol LoginProtocol { 
    func didRecieveLoginResponse(status: Bool, message: String?) 
} 

class User : APIControllerProtocol { 
    var delegate: LoginProtocol 
    var username: String? 
    var company: String? 
    var auth_token: String? 
    // more properties here 

    // initiate the class, must have a delegate as per the protocol 
    init(delegate: LoginProtocol, username: String?, school: String?) { 
    self.delegate = delegate 
    if(username != nil) { 
     self.username = username 
     self.company = company 

    } 
    } 

    // login using the API 
    func login(password: String) { 
    print("Logging in as " + username! + " - " + company!) 
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true 
    let api = APIController(delegate: self) 
    var postFields = [String: String]() 
    postFields["username"] = username 
    postFields["password"] = password 
    postFields["company"] = company 
    api.request("login",postData: postFields) 
    } 

    // API results were received, log in the user if appropriate 
    func didRecieveAPIResults(originalRequest: String,apiResponse: APIResponse) { 
    dispatch_async(dispatch_get_main_queue(), { 
     if(apiResponse.status == true) { 
      self.auth_token = details["auth_token"] 
      // more properties here 
      self.save_to_user_defaults() 
      self.delegate.didRecieveLoginResponse(true, message:nil) 
     } else { 
      self.delegate.didRecieveLoginResponse(false, message:apiResponse.message) 
     } 
     UIApplication.sharedApplication().networkActivityIndicatorVisible = false 
    }) 
    } 

    // save the properties to user defaults 
    func save_to_user_defaults() { 
    let defaults = NSUserDefaults.standardUserDefaults() 
    defaults.setObject(self.username, forKey: "username") 
    defaults.setObject(self.company, forKey: "company") 
    defaults.setObject(self.auth_token, forKey: "auth_token") 
    // more properties here 
    } 

    // load the properties from user defaults 
    func load_from_user_defaults() { 
    let defaults = NSUserDefaults.standardUserDefaults() 
    self.username = defaults.objectForKey("username") as? String 
    self.company = defaults.objectForKey("company") as? String 
    self.auth_token = defaults.objectForKey("auth_token") as? String 
    // more properties here 
    } 
} 

Следующий этап для меня регистрирует в потребителе через NSUserDefaults - мой план, чтобы сделать это через что-то вроде этого:

let user = User() 
user.load_from_user_defaults() 

Однако я не совсем уверен, :

  • ли я на правильном пути (это мой первый полный быстрое приложение)
  • Если я, где поставить выше 2 строки кода (возможно, приложение D elegate?), так что, когда приложение открыто, пользователь в NSUserDefaults (если он есть) записывается в
  • Как разрешить остальной доступ к приложению пользователю (я хотел бы иметь возможность иметь возможность ссылаться на пользовательские данные в контроллерах моего вида, например let pointsLabel.text = users.points)

Большое вам спасибо!

ответ

2

Надежда, мой ответ будет способствовать улучшению вашего приложения:

  1. NSUserDefaults не является безопасным, его можно легко открыть и прочитать, как на устройстве & на Mac. Таким образом, пользовательские настройки по умолчанию - это хорошее место для настроек и информации о конфигурации, однако это не очень полезно для конфиденциальной информации, например паролей. Проверьте link для получения более подробной информации.
  2. Да, это должно быть в приложении делегата. Загрузите данные пользователя и соответствующим образом представляйте представление.
  3. Либо вы можете передавать пользовательские данные, чтобы просмотреть контроллер, либо просто прочитать постоянное хранилище. Зависит от вашего требования.
+0

Спасибо Анни, это очень полезно! Предположительно, такие вещи, как имя пользователя, отлично подходят для NSUserDefaults, но что-то вроде токена аутентификации должно идти в keychain? – Ben

+1

Да, вы можете хранить нечувствительную информацию (имя пользователя также отлично) в NSUserDefaults. –

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