我们在开发过程中可能遇到各种各样的问题,比如说实时通信中收不到消息等等。
下面会列举很多例子,看一下我们在各种情况里,是如何定位问题并解决的。
案例一
关键字:_User、错误码、session
问题详情
背景:在用户 _User 表里,包含一个使用天数的字段 usedDays。
需求:在客户端能够查看所有的用户,且能够修改这个天数的字段值。
尝试:在未登陆任何的 AVUser 的前提下,直接使用如下代码
AVQuery *query = [AVQuery queryWithClassName:@"_User"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
[[objects firstObject] setObject:@"12" forKey:@"usedDays"];
[[objects firstObject] saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
NSLog(@"%@",error);
}];
}];
问题:报错 206 The user cannot be altered by a client without the session。
这是什么意思?
定位问题
1、开启调试日志
[AVOSCloud setAllLogsEnabled:true];
2、复现代码对应的 cURL 日志,和官方 cURL 比对,并无异样
------ BEGIN LeanCloud REST Request ------
path: /1.1/users
curl: curl -i -k --compressed -X GET -H 'User-Agent: AVOS Cloud iOS-v3.2.7 SDK' -H 'Content-Type: application/json; charset=utf-8' -H 'Accept: application/json' -H 'X-LC-Id: I4ObRReguIe0oBzkM5UxmVx8' -H 'X-LC-Sign: xxx' -H 'X-LC-Session: og493hyliobw79rc4uwzooge3' -H 'X-LC-Prod: 1' "https://api.leancloud.cn/1.1/users"
------ END -------------------------------
3、服务端返回的错误码
2016-08-10 17:09:09.552 LeanDemo_iOS[7304:1841168] Error Domain=AVOS Cloud Error Domain Code=206 "(null)"
4、查找错误码的意思
206
信息 - The user cannot be altered by a client without the session.
含义 - 没有提供 session,无法修改用户信息,这通常是因为没有登录的用户想修改信息。修改用户信息必须登录,除非在云引擎里使用 master key 来更改。
解决方案
看到错误码的解释后,我们明白我们的出发点就错了。对于 _User 表而言:
- 只能某个用户登录后,拿到服务端返回的用于认证身份的 session,才能修改 TA 本人的数据。
- 即使是登录了的当前用户,也不能更改其它用户 _User 的数据。
那我们的这个需求如何解决?
同样参考上面的定位问题第 4 步,这需要在后端,即云引擎里操作,调用时使用 Master Key 来突破这种限制。