繁体   English   中英

为什么我不能在Swift应用程序的钥匙串中放入(通过alamofire呼叫)令牌?

[英]Why I cannot put the received (by the alamofire call) token in the keychain in my swift app?

我有一个Web服务,可以向我返回一些数据,例如nameloginauth_token 到目前为止,我已经保存了namelogin了NSUserDefaults。 现在,我还想安全地存储auth_token ,因此我决定将其放入钥匙串中。 为此,我决定使用https://github.com/matthewpalmer/Locksmith这个插件。

到目前为止,我的代码如下所示:

Alamofire.request(.POST, "\(serverURL)/authorization", parameters: params)
    .validate()
    .response { (request, response, data, error) in
        if(error != nil){
            print("error = \(error)") 
        }else{

            let username = json["name"]
            let login = json["login"]
            let auth_token = json["auth_token"]

            let defaults =  NSUserDefaults.standardUserDefaults()

            defaults.setObject(login, forKey: "login")
            defaults.setObject(username, forKey: "username")

            defaults.synchronize() 

            let sb = UIStoryboard(name: "Main", bundle: nil)
            if let tabBarVC = sb.instantiateViewControllerWithIdentifier("TabController") as? TabController {
                self.window!.rootViewController = tabBarVC
            }

        }
}

但是当我添加这一行时:

 try Locksmith.saveData(["auth_token": json["auth_token"]], forUserAccount: "my_auth_token") 

之后:

 let defaults =  NSUserDefaults.standardUserDefaults()

然后我在Alamofire.requestAlamofire.request

Cannot call value of non-function type 'NSHTTPURLResponse?'

所以我的问题是-如何将来自Web服务的auth_token保存在钥匙串中?

您遇到的是类型不匹配,并且不幸的事实是AlamoFire Request类同时具有一个名为response的函数和一个名为response的属性(类型为NSHTTPURLResponse? ,看起来很熟悉=))

在您的代码中,您正在调用try ,这需要将封闭的闭包/函数标记为throws ,或者您必须将代码包装在do-catch

因此,swift编译器的工作是推断您正在编写的闭包已作为其定义的一部分throws 显然,这与应该传递给func response的闭包的定义不匹配,因此它将尝试找到的另一个 response ,即属性。 然后它就完全失败了,因为您不能尝试“调用”可选类型。

您应该在闭包内部添加一个do-catch来处理Locksmith可能引发的错误。

编辑:回应您的评论。 您只需要将该调用包装在do catch中即可正确处理错误。 有关Swifts错误处理模型的详细信息,请参见https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html

至于要捕获的错误,只需浏览一下Locksmith API,它就会抛出从Keychain API接收到的错误。 幸运的是,他们已经在此处定义了抛出的错误: https : //github.com/matthewpalmer/Locksmith/blob/master/Source/LocksmithError.swift

作为写东西的一个例子,就是这样

Alamofire.request(.POST, "\(serverURL)/authorization", parameters: params)
    .validate()
    .response { (request, response, data, error) in
        if(error != nil){
            print("error = \(error)") 
        }else{

            let username = json["name"]
            let login = json["login"]
            let auth_token = json["auth_token"]

            let defaults =  NSUserDefaults.standardUserDefaults()
            do {
                try Locksmith.saveData(["auth_token": json["auth_token"]], forUserAccount: "my_auth_token")
            } catch {
                // Handle the error, however you best see fit
                print("Error trying to save to keychain \(error)")
            }

            defaults.setObject(login, forKey: "login")
            defaults.setObject(username, forKey: "username")

            defaults.synchronize() 

            let sb = UIStoryboard(name: "Main", bundle: nil)
            if let tabBarVC = sb.instantiateViewControllerWithIdentifier("TabController") as? TabController {
                self.window!.rootViewController = tabBarVC
            }

        }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM