Xcode iOS:检查用户是否已登录并显示不同的视图

时间:2014-01-18 09:30:30

标签: ios xcode session login nsuserdefaults

我正在编写一个应用程序,其中登录用户比未登录用户有更多功能。基本上,我有或多或少5个标签。当我启动应用程序时,用户立即获得登录页面。他可以决定跳过它。如果他跳过它,那么他只会有3个标签。如果他成功登录,则会有5个。

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

所以:如果用户登录,存储会话,并显示所有选项卡。如果他没有,只显示有限数量的标签。 我该怎么做呢?

3 个答案:

答案 0 :(得分:3)

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

如果您使用的话,可以在NSUserDefaults或CoreData中存储用户名。使用钥匙串最好存储密码。 SSKeychain可以轻松完成此操作。

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

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

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

如果用户退出,可以通过

轻松删除钥匙串中的密码
[SSKeychain deletePasswordForService:myAppName account:userName]

答案 1 :(得分:1)

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

你可能正在寻找的东西被称为Singleton设计模式(有些人拒绝它,但它可以非常方便)。您所做的是创建一个在代码中随处可用的对象。在此对象中,您可以存储一个BOOL,指示用户是否已登录。例如: (我没有运行这个,只是为了得到这个想法)

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

此代码可用于每个类,因此您始终可以访问用户的数据。在这种情况下,Manager将是一个单独的类,它提供单例功能。看看如何在这里制作一个:http://www.johnwordsworth.com/2010/04/iphone-code-snippet-the-singleton-pattern/

答案 2 :(得分:1)

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

不要将NSUserDefaults用作会话,这是一个不好的解决方案

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

让我们创建一个结构化的用户类

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

为实现这一目标,我们需要建立一个很好的结构来正确组织它。请记住,当前用户和其他用户都是“用户”,因此我们将使用相同的类。

创建一个类并将其命名为“EDUser”(如果需要,可以选择其他名称) 该类将包含用户信息(当前用户或其他用户) 更重要的是,这个类将具有记录用户的能力。

这是一个类似于什么的图片:

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()

检查用户是否已登录

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())