Ios 保存登录会话凭据并在整个应用程序中加载
我是iOS开发新手。我正在开发照片共享应用程序。在这里,首先我需要使用Web服务来登录页面。Web服务使用PHP,返回响应使用JSON。我想在整个应用程序中保存登录会话。当用户启动应用程序时,它总是检查用户是否登录。如果我没有提前完成,请尽快给我合适的解决方案,因为我的工作已经到了最后期限。这是我的密码 @结束Ios 保存登录会话凭据并在整个应用程序中加载,ios,json,web-services,authentication,login,Ios,Json,Web Services,Authentication,Login,我是iOS开发新手。我正在开发照片共享应用程序。在这里,首先我需要使用Web服务来登录页面。Web服务使用PHP,返回响应使用JSON。我想在整个应用程序中保存登录会话。当用户启动应用程序时,它总是检查用户是否登录。如果我没有提前完成,请尽快给我合适的解决方案,因为我的工作已经到了最后期限。这是我的密码 @结束 最简单的解决方案是使用钥匙链 另一个简单的方法是将登录凭据保存在区域设置文件(txt、xml甚至sqldb)中。最简单的解决方案是使用keychain 另一个简单的方法是将登录凭据保存在
最简单的解决方案是使用钥匙链
另一个简单的方法是将登录凭据保存在区域设置文件(txt、xml甚至sqldb)中。最简单的解决方案是使用keychain
另一个简单的方法是将登录凭据保存在区域设置文件(txt、xml甚至sqldb)中。您可以将登录数据保存在NSUserDefaults中,如下所示
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:cookieString forKey:@"Cookie"];
[userDefaults setObject:pwString forKey:@"Password"];
[userDefaults synchronize];
然后,您可以使用从应用程序中的任意位置加载用户默认值
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *myString = [defaults objectForKey:@"Cookie"];
您可以将登录数据保存在NSUserDefaults中,如下所示
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:cookieString forKey:@"Cookie"];
[userDefaults setObject:pwString forKey:@"Password"];
[userDefaults synchronize];
然后,您可以使用从应用程序中的任意位置加载用户默认值
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *myString = [defaults objectForKey:@"Cookie"];
我会给你一个全面的答案 不要使用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
}
}
用例
现在一切就绪,我们可以像这样使用它
非阻塞登录过程
注销
检查用户是否已登录
在任何屏幕上获取当前用户数据
将其他用户存储为对象
我会给你一个全面的答案 不要使用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
}
}
用例
现在一切就绪,我们可以像这样使用它
非阻塞登录过程
注销
检查用户是否已登录
在任何屏幕上获取当前用户数据
将其他用户存储为对象
你好brainray。。。。。谢谢你的评论。但是你能告诉我什么是cookieString,什么是Cookie在forKey中,密码也是一样的。你可以自己定义这些密钥,默认情况下它们不在那里。使用“setObject forKey”,您可以在字典中设置一个可以另存为Plist的条目。下面是一个可能会有所帮助的教程:我可以获取cookie web服务吗?或者如果是本地的,那么我们如何定义它?请告诉我brain ray…你需要通过登录网站获取cookie。你知道Charles proxy(charlesproxy.com)吗。这是一款mac应用程序,您可以在浏览器中跟踪登录网站等时发生的情况。如果您知道cookie是如何发送的,您可以在Xcode中以编程方式执行。将用户凭据存储在NSUserDefaults中是一个非常糟糕的主意。您好brainray。。。。。谢谢你的评论。但是你能告诉我什么是cookieString,什么是Cookie在forKey中,密码也是一样的。你可以自己定义这些密钥,默认情况下它们不在那里。使用“setObject forKey”,您可以在字典中设置一个可以另存为Plist的条目。下面是一个可能会有所帮助的教程:我可以获取cookie web服务吗?或者如果是本地的,那么我们如何定义它?请告诉我brain ray…你需要通过登录网站获取cookie。你知道Charles proxy(charlesproxy.com)吗。这是一款mac应用程序,您可以在浏览器中跟踪登录网站等时发生的情况。如果您知道cookie是如何发送的,您可以在Xcode中以编程方式发送。将用户凭据存储在NSUserDefaults中是一个非常糟糕的主意。将它们存储在本地文件、xml或sql数据库中也不是,除非它们使用不易获取的私人机密进行加密。将它们存储在本地文件、xml或sql数据库中也不是,除非它们是用不容易获得的私人秘密加密的。
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())