在Xcode中创建登录/注册视图

时间:2016-06-16 16:38:18

标签: ios objective-c database xcode authentication

我在Xcode中为iOS制作应用程序。

我的问题是: 如何让应用程序在需要时显示注册/登录视图,但在用户已登录时不显示? 每次应用程序启动时它是否与数据库通信? 我打算使用MySQL来创建一个简单用户(用户名,分数,朋友)的数据库。 是否有教程会告诉我这样做的步骤? 我没有数据库经验。

帮助表示赞赏。

3 个答案:

答案 0 :(得分:0)

你需要看一堆教程,我推荐这些人:

https://www.raywenderlich.com

他们有ObjC和Swift的免费教程以及视频课程!

答案 1 :(得分:0)

如果没有有效/已记录的用户,REST API通常会使用401 (Unauthorized code)进行响应,因此每次我获得401我都会在模态视图中显示登录信息。

因此,当您加载应用时,请调用GET currentUser端点,如果它返回401,则应用将显示登录信息,否则,应用将显示默认的rootViewController

我喜欢这种方式,因为如果由于任何原因,您的session不再有效,则应用会显示登录视图。

答案 2 :(得分:0)

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

不要使用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())