我在Xcode中为iOS制作应用程序。
我的问题是: 如何让应用程序在需要时显示注册/登录视图,但在用户已登录时不显示? 每次应用程序启动时它是否与数据库通信? 我打算使用MySQL来创建一个简单用户(用户名,分数,朋友)的数据库。 是否有教程会告诉我这样做的步骤? 我没有数据库经验。
帮助表示赞赏。
答案 0 :(得分:0)
答案 1 :(得分:0)
如果没有有效/已记录的用户,REST API通常会使用401 (Unauthorized code)
进行响应,因此每次我获得401
我都会在模态视图中显示登录信息。
因此,当您加载应用时,请调用GET currentUser
端点,如果它返回401
,则应用将显示登录信息,否则,应用将显示默认的rootViewController
。
我喜欢这种方式,因为如果由于任何原因,您的session
不再有效,则应用会显示登录视图。
答案 2 :(得分:0)
我会给你一个全面的答案。
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())