Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 保存登录会话凭据并在整个应用程序中加载_Ios_Json_Web Services_Authentication_Login - Fatal编程技术网

Ios 保存登录会话凭据并在整个应用程序中加载

Ios 保存登录会话凭据并在整个应用程序中加载,ios,json,web-services,authentication,login,Ios,Json,Web Services,Authentication,Login,我是iOS开发新手。我正在开发照片共享应用程序。在这里,首先我需要使用Web服务来登录页面。Web服务使用PHP,返回响应使用JSON。我想在整个应用程序中保存登录会话。当用户启动应用程序时,它总是检查用户是否登录。如果我没有提前完成,请尽快给我合适的解决方案,因为我的工作已经到了最后期限。这是我的密码 @结束 最简单的解决方案是使用钥匙链 另一个简单的方法是将登录凭据保存在区域设置文件(txt、xml甚至sqldb)中。最简单的解决方案是使用keychain 另一个简单的方法是将登录凭据保存在

我是iOS开发新手。我正在开发照片共享应用程序。在这里,首先我需要使用Web服务来登录页面。Web服务使用PHP,返回响应使用JSON。我想在整个应用程序中保存登录会话。当用户启动应用程序时,它总是检查用户是否登录。如果我没有提前完成,请尽快给我合适的解决方案,因为我的工作已经到了最后期限。这是我的密码

@结束


最简单的解决方案是使用钥匙链


另一个简单的方法是将登录凭据保存在区域设置文件(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())