我正在编写一个应用程序,其中登录用户比未登录用户有更多功能。基本上,我有或多或少5个标签。当我启动应用程序时,用户立即获得登录页面。他可以决定跳过它。如果他跳过它,那么他只会有3个标签。如果他成功登录,则会有5个。
我已经制作了登录页面。如果用户登录正确,我只是不知道如何存储会话,如果用户没有,则只显示一定数量的选项卡。我来自PHP,我刚刚开始学习Objective-C,所以我在PHP中寻找与$ _SESSION相同的东西,或多或少。
所以:如果用户登录,存储会话,并显示所有选项卡。如果他没有,只显示有限数量的标签。 我该怎么做呢?
答案 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数据未加密,可能会导致安全问题。
当用户登录时,您需要确保您可以访问整个应用中的用户数据,以便在需要时可以在任何屏幕上获取数据。
为实现这一目标,我们需要建立一个很好的结构来正确组织它。请记住,当前用户和其他用户都是“用户”,因此我们将使用相同的类。
创建一个类并将其命名为“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())