关于LeanCloud SDK 使用中数据提交的问题
首先我想指出,这个问题主要是参考一本书中所出现的问题,进行个人修正。书名“iOS 10快速开发:18天零基础开发一个商业应用 刘铭著”
出错地点:第六章 提交用户注册信息到 LeanCloud ;6.4 提交数据到 LeanCloud 平台。
具体出错源代码:
let user = AVUser()
user.username = usernameTxt.text!.lowercased()
user.email = emailTxt.text!.lowercased()
user.password = passwordTxt.text!
user["fullname"] = fullNameTxt.text!.lowercased()
user["bio"] =bioTxt.text!
user["web"] = webTxt.text!.lowercased()
user["gender"] =""
let avaData = UIImageJPEGRepresentation(avaImg.image!, 0.5)
let avaFile = AVFile(name: "iPhone.jpg", data: avaData!)
user["ava"] = avaFile as? LCValue
user.signUpInBackground{
(success: Bool, error: Error?) in
if success {
print("用户注册成功!")
}else {
print(error!.localizedDescription)
}
}
如果你使用如上的实例代码,就会发生 401 的验证报错。具体出错代码如下:
[ERROR] +[AVErrorUtils errorFromJSON:] [Line 205] error: Error Domain=AVOS Cloud Error Domain Code=401 "Unauthorized." UserInfo={error=Unauthorized., NSLocalizedDescription=Unauthorized., code=401}[DEBUG] -[AVPaasClient performRequest:success:failure:wait:]blockinvoke [Line 630]response: Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: unauthorized (401)" UserInfo={NSLocalizedDescription=Request failed: unauthorized (401), NSErrorFailingURLKey=https://api.leancloud.cn/1.1/fileTokens, com.alamofire.serialization.response.error.data=<7b22636f 6465223a 3430312c 22657272 6f72223a 22556e61 7574686f 72697a65 642e227d>, com.alamofire.serialization.response.error.response= { URL: https://api.leancloud.cn/1.1/fileTokens } { Status Code: 401, Headers { "Cache-Control" = ( "no-cache,no-store" ); Connection = ( "keep-alive" ); "Content-Type" = ( "application/json;charset=utf-8" ); Date = ( "Fri, 01 Dec 2017 04:48:05 GMT" ); Pragma = ( "no-cache" ); Server = ( openresty ); "Transfer-Encoding" = ( Identity ); } }}
出错原因:
AVUser 是 oc 版本下的类。
解决办法:
如果用 swift 语言进行编写的话,应该使用的是 LCUser。同同时将用户信息提交到后台服务器的代码也并不能使用类的属性进行,需要使用 GCD代码自行申明后台运行。
更改后的代码如下:
//提交到云平台
let user = LCUser()
user.username = LCString(usernameTxt.text!.lowercased())
user.email = LCString(emailTxt.text!.lowercased())
user.password = LCString(passwordTxt.text!)
user["fullname"] = LCString(fullNameTxt.text!.lowercased())
user["bio"] = LCString(bioTxt.text!)
user["web"] = LCString(webTxt.text!.lowercased())
user["gender"] = LCString("")
let avaData = UIImageJPEGRepresentation(avaImg.image!, 0.5)
let avaFile = AVFile(name: "iPhone.jpg", data: avaData!)
user["ava"] = avaFile as? LCValue
let queue = DispatchQueue(label:"llll",qos: .background)
queue.async { user.signUp() }
可以看到在后台信息管理端,信息提交成功了:
提交成功!同时有个问题,就是如果出错的话,是没有办法输出错误代码的。这个问题目前并没有找到方法,因为 LCUser 中只有提交信息的属性,而没有找到错误抛出的相关代码。
参考资料:数据存储开发指南 · Swift