我们在开发过程中可能遇到各种各样的问题,比如说实时通信中收不到消息等等。
下面会列举很多例子,看一下我们在各种情况里,是如何定位问题并解决的。

案例一

关键字:_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 日志,和官方 cURL3 比对,并无异样

------ 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、查找错误码3的意思

206

信息 - The user cannot be altered by a client without the session.
含义 - 没有提供 session,无法修改用户信息,这通常是因为没有登录的用户想修改信息。修改用户信息必须登录,除非在云引擎里使用 master key 来更改。

解决方案

看到错误码的解释后,我们明白我们的出发点就错了。对于 _User 表而言:

  1. 只能某个用户登录后,拿到服务端返回的用于认证身份的 session,才能修改 TA 本人的数据。
  2. 即使是登录了的当前用户,也不能更改其它用户 _User 的数据。

那我们的这个需求如何解决?

同样参考上面的定位问题第 4 步,这需要在后端,即云引擎里操作,调用时使用 Master Key 来突破这种限制。