Xcode iOS:检查用户是否login,如果不是,则显示不同的视图

我正在编写一个应用程序,login的用户有一些额外的function比非login用户。 基本上,我有或多或less的5个选项卡。 当我启动应用程序,用户立即得到login页面。 他可以决定跳过它。 如果他跳过,他只会有三个标签。 如果他成功login,将会有5个。

我已经有我的login页面。 我只是不知道如何才能存储会话,如果用户login正确,并且只显示一定数量的选项卡,如果用户不是。 我来自PHP,我刚刚开始学习Objective-C,所以我在PHP中寻找与$ _SESSION相同的东西,或多或less。

所以:如果用户login,存储会话,并显示所有的标签。 如果他没有,只显示有限数量的选项卡。 我应该如何处理这个?

在存储会话方面,我假设用户名和密码就足够了。

如果您正在使用NSUserDefaults或CoreData,则可以按照您的意愿存储用户名。 存储密码最好使用钥匙串。 SSKeychain可以很容易地做到这一点。

[SSKeychain setPassword:password forService:myAppName account:userName] 

你可以存储他们在内存中login的事实,但在应用程序重新启动时检查:

 NSString *password = [SSKeychain passwordForService:myAppName account:userName]; if (password != nil) { // Logged in } 

如果用户注销,轻松从密钥链中删除密码

 [SSKeychain deletePasswordForService:myAppName account:userName] 

会话处理在您使用NSURLConnection时自动完成,因此您可以将用户数据存储在服务器上的Sesssion中。

你可能要找的东西叫做Singletondevise模式(有些人拒绝它,但它可以非常方便)。 你所做的是创build一个在你的代码中可用的对象。 在这个对象中,例如,存储一个指示用户是否已经login的BOOL。 例如:(我没有运行这个,只是为了得到这个想法)

 Mananger myManager* = [Manager sharedManager]; if(myManager.loggedIn){ //Show 5 tabs }else{ //Show 3 Tabs } 

这个代码可以在每个类中使用,所以你可以随时访问你的用户数据。 在这种情况下,pipe理器将是一个独立的类,它提供单例function。 看看如何在这里做一个: http : //www.johnwordsworth.com/2010/04/iphone-code-snippet-the-singleton-pattern/

我会给你一个全面的答案。

不要使用NSUserDefaults作为会话,这是一个不好的解决scheme

NSUserDefaults数据未encryption,可能会导致安全问题。

我们来创build一个结构化的用户类

当用户login时,您需要确保您有权访问整个应用程序中的用户数据,以便您可以在需要时在任何屏幕上获取数据。

为了达到这个目的,我们需要build立一个良好的结构来正确地组织这一点。 请记住,当前用户和其他用户都是“用户”,所以我们将使用相同的类。

创build一个class级并将其命名为“EDUser”(如果需要,可以select其他名称)。
这个类将包含用户信息(当前用户或其他用户)。
更重要的是,这个类将有能力login用户。

下面是class级的样子:

 class EDUser { var firstName: String var lastName: String? var birthDate: NSDate? init(firstName: String, lastName: String?, birthDate: NSDate?) { self.firstName = firstName self.lastName = lastName self.birthDate = birthDate } } // MARK: - Accessor extension EDUser { class var currentUser: EDUser? { get { return loadCurrentUserFromDisk() } set { saveCurrentUserToDiskWithUser(newValue) } } } // MARK: - Log in and out extension EDUser { class func loginWithUsername(username: String, andPassword password: String, callback: (EDUser?, NSError) -> Void) { // Access the web API var parameters = [ "username": username, "password": password ] YourNetworkingLibrary.request(.POST, "https://api.yourwebsite.com/login", parameters: parameters).responseJSON { response in if response.statusCode == .Success { let user = EDUser(firstName: response["firstName"], lastName: response["lastName"], birthDate: NSDate.dateFromString(response["birthDate"])) currentUser = user callback(currentUser, nil) } else { callback(nil, yourError) } } } class func logout() { deleteCurrentUserFromDisk() } } // MARK: - Data extension EDUser { class private func saveCurrentUserToDiskWithUser(user: EDUser) { // In this process, you encode the user to file and store it } class private func loadCurrentUserFromDisk() -> EDUser? { // In this process, you get the file and decode that to EDUser object // This function will return nil if the file is not exist } class private func deleteCurrentUserFromDisk() { // This will delete the current user file from disk } } // MARK: - Helper extension NSDate { class func dateFromString(string: String) -> NSDate { // convert string into NSDate } } 

用例

现在一切就绪,我们可以像这样使用它

非阻塞日志正在进行中

 EDUser.loginWithUsername(username: "edward@domain.com", password: "1234") { user, error in if error == nil { // Login succeeded } else { // Login failed } } 

注销

 EDUser.logout() 

检查用户是否login

 if EDUser.currentUser != nil { // The user is logged in } else { // No user logged in // Show the login screen here } 

在任何屏幕上获取当前的用户数据

 if let currentUser = EDUser.currentUser { // do something with current user data } 

将其他用户存储为对象

 let user = EDUser(firstName: "Edward", lastName: "Anthony", birthDate: NSDate())