乐动力“网络不给力”问题的处理
MX5上的乐动力 App 很早以前就不能登录了,各种途径都是提示“网络不给力”,等了大半年看他们是否会修正这个问题,但是每次版本更新后都试了,问题依旧存在。而且,无论是官网还是 App或是微博客服,都没有提供相关的说明该如何操作。
为了不丢失数据,只好自己动手了。
进入 Flyme 5 的访客系统,安装微信和乐动力 App,测试登录正常,之前的数据也能正常同步下来。
第一步,祭出 Charles 看看都干了啥
启动 Charles,然后在手机上设置代理,进行登录,发现一个正常的登录主要做了几个操作:
- adduser,发送一个 pc 串,返回一个临时的 id
- authbywechat,登录请求,url参数 uid 为之前请求的临时 id,返回用户 id
- getinfo,获得用户相关信息,包括头像 url
- updatewechatinfo,更新数据
- updateinfo,更新数据
第二步,进入正常的系统,看看无法登录的版本都做了些什么
- authbywechat,url参数 uid 为残留的用户 id,返回 {“errorCode”: -10001, “ret”: “auth fail”}
返回错误后就没有后续请求了。
现在看来就是验证的时候的 uid 的问题。查看反编译后的代码的时候发现,登录成功后这个 uid 是会被覆盖的。这样的话,给 App 一些正常的数据,让他先登录成功一次,以后理论上就不会有问题了。
如果是 root 的设备,直接把 SharedPreferences 中的 uid 的值改为0,App 就会进入 adduser 的流程,这样会比较简单。我不想 root 这个设备,所以写了些代码来模拟登录的流程。
第三部,拦截请求,修改数据
把正常登录的数据保存下来,在拦截到请求后把这些数据返回给 App。可能这部分也可以在 Charles 中完成,不过我修改了 hosts 文件,然后直接写了些 php 代码:
hosts 文件:
127.0.0.1 walk.ledongli.cn |
路由部分:
Route::post('/v2/rest/users/authbywechat', 'MsgController@handleAuthWeChat'); |
响应部分(uid 和部分返回值删除了):
public function handleUpdateWeChatInfo(Request $request) { |
登录进入 App 之后,把 hosts 文件还原,去掉手机上 wifi 的代理,再在 App 中点击立即备份数据
,可以看到开始正常备份了。
最后
- 之所以出现这个问题,是因为残留的 uid 去请求登录的时候会导致失败。可能的原因大概是某一个版本的登录逻辑改变了,但是没有处理好老版本的兼容性。其实哪怕多加一个按钮能重置一下用于登录的临时 id 也好啊。
- 同步的时候也出现了问题,同步一两条数据后就会卡住不动,不会自动重新开始,需要用户反复的进行操作才能把所有的数据同步完。
- 退出登录的时候,居然真的把用户的数据删除了。
综合来看,乐动力这个 App 在这部分上设计得是比较烂的,可能只是一个临时的外包产品的品质。