安卓新浪微博授权分享 小米8Android9的坑。解决web网页授权无法正确回调bug。

news/2024/11/17 1:50:27/

微博登录,分享都是很常用的功能。正在划水的某一天,测试MM突然提了个bug,说微博分享不能用了,纳尼,之前不是测试N遍,怎么突然不能用了。

仔细一看,是这样的。手机没有安装微博客户端,会走SDK内部网页分享,先登录,在分享。正常没问题。可是现在如图,登录完,跳转到配置的回调url   SINA_REDIRECT_URI: "http://www.joyshebao.com/"    导致没有装微博,就不能用,这不能忍。

下图为bug流程

                  

下图为正常逻辑,应该跳转到分享web界面

仔细排查了下,不是通用问题,目前只有小米8 (android9) 这部测试机会出现这个问题,sdk内置web授权分享无法使用。

发现问题,开debug,一步步找吧。

1,定位问题为新浪内部sdk流程有误,导致转发错误。开始一步步,排查,首先从SDK,分享入口开始。

    当没有安装微博客户端时,会走到  com.sina.weibo.sdk.web.WeiboSdkWebActivity  界面,

 

初始化会走到initLoad方法,进而设置webClient ,WebViewClient 是监听web加载以及做拦截处理的,微博集成了WebViewClient,使用了策略模式,再次根据不同状态,设置不同的client。

通过调试代码,走到了AuthWebViewClient中,然后看一下代码,做了哪些工作。

微博SDK中AuthWebViewClient重写了onPageStarted()  ,加载之前来判断是否需要做callback 处理。

if(url.startsWith(authInfo.getRedirectUrl()) && !this.authed) {this.authed = true;this.handleRedirectUrl(url);view.stopLoading();if(this.requestCallback != null) {this.requestCallback.closePage();}} else {super.onPageStarted(view, url, favicon);
}

内部这段核心逻辑,getRedirectUrl 有没有很眼熟,没错,就是微博要求配置的回调url(SINA_REDIRECT_URI)

可以看到,初次登录完成后,满足 !this.authed 并且满足配置的url匹配开头,就会停止当前webview 加载,结束并返回,然后加载新的分享界面。

bug就出现在此了,这里要跳转的url  与authInfo.getRedirectUrl()  不匹配,直接super.onPageStarted()。没有关闭,所以导致跳转到自己配置的url 界面了。

这种机制本来是检测app是否与官网填写的一致,更多安全性考虑。但是小米手机上不通用了。

调试发现返回的URL 是 https://xxxxx     而自己配置的是http://xxxx   这就尴尬了,小米8手机给替换成了https,测试其他品牌手机没有这个问题。不会替换,所以也就可以进入到if(true)控制逻辑,顺利结束返回。

既然问题找到了,解决方案就是保持一致呗

但是onPageStarted是系统级别的,找了半天没发现任何特出处理,推测应该是小米系统定制的时候内有处理了,把http默认统一为https。(随着https 大面积应用,普及率越来越高。这种设计也无可厚非,但是坑了老app,最早注册的http的)

 

既然没法弄,就想法该微博后台配置得了,最简单,设置为https 开头的。但是,这样就影响了线上已发版的app,毕竟它们都是配置的redirectUrl为http://,如果改了微博后台配置,那么大面积就没法用了。

 

要找到一个成本最低,不影响线上环境的方案。思来想去,还是要从app端入手。采用hook思想,使用AspectJ 切面,动态的拦截流程,把url再给改回来。

先上代码:

切面技术使用了AspectJ,一位android大佬封装的Aop。(具体用法可以自行百度)

之前已经找到bug原因,那么就针对这个方法,切入进去,使用@Around 来接管这个方法,监听到url为https://xxxx时,那么就改为http://xxxx ,然后再调用joinPoint.proceed();把本来的参数二次修改后,再传回去原方法。这样,就解决了微博web授权跳转异常问题。

经测试,兼容所有版本,小米8奇葩的异常解决了。下次发版,小米8用户就可以用了。最小的代价,去解决这个问题。

 

小结:还有建议最大可能的使用https,不论是安全性问题,还是一些手机系统解析问题,都会减少不必要的bug。

           通过看微博SDK,也学到很多,比如策略模式的使用,观察者,委托。

           一步步debug,找到核心,采用最小影响的方案,去解决。

 

 


http://www.ppmy.cn/news/574415.html

相关文章

新浪微博

https://api.weibo.com/oauth2/default.html 1. 引导需要授权的用户到如下地址: https://api.weibo.com/oauth2/authorize?client_idxxx&response_typecode&redirect_urihttps://api.weibo.com/oauth2/default.html 2. 如果用户同意授权,页面跳转至 YOUR_R…

小米周受资同学加盟字节跳动任CFO,雷军微博祝福

先来看看周同学,还是比较帅的 3月24日消息,今日,小米集团在港交所公告,公告称,董事会宣布,因家庭原因,周受资已辞任执行董事职务,自2021年3月24日起生效。同时周受资已请辞公司国际部…

每日新闻:雷军微博互动李东生,小米又有新动作?

生命是以时间为单位的,浪费别人的时间等于谋财害命,浪费自己的时间,等于慢性自杀。——鲁迅 中国软件网每日精选文集 中国软件网 每日新闻播报 第01-07期 1 趋 势 洞 察 ■ 工信部总经济师:五方面推动新一代信息技术产业发展 工业…

小米的隔空充电,看起来好酷

昨天是1月29号,昨天小米发布了一个隔空充电技术,很火爆,大胆想,如果有一条无线充电的高速公路,那电动汽车还担心没有电吗? —— 雷总的微博原文 隔空充电技术:如科幻电影一般,拿着手…

UE中创建可脚本化编辑器工具(Scriptable Tools)

UE5.2中提供了可脚本化工具编辑模式,该模式下用户可以编写蓝图节点自定义界面操作模式下的逻辑,例如重写鼠标点击事件,制作自定义画刷等。 如果你不太了解UE编辑器工具,可以参考这篇文章: https://blog.csdn.net/gray…

小米首页vue

路由配置 import Vue from vue import VueRouter from vue-router import Home from ../views/Home.vue Vue.use(VueRouter) const routes [{ path: /, name: Home, component: Home }, ] const router new VueRouter({ routes }) export default router main.js import …

计算机图形学 期末复习 微课版 孔令德 一、导论 期末复习

计算机图形学是一门研究如何利用计算机表示、生成、处理和显示图形的学科 计算机图形学是研究如何利用计算机把描述图形的几何模型通过指定的算法和程序转化为图像并进行显示的一门学科 图形的表示方法为参数法和点阵法。 一般用参数法描述的图形仍然称为图形(graph…

华硕服务器系统都还原不了,windows10系统还原失败怎么办|windows10系统还原失败如何解决...

很多朋友都遇到过windows10系统还原失败的问题,那么我们该如何摆脱它呢?一些用户会使用win10重置功能来解决,但是如果重置失败,会出现无限重启或inaccessible boot device,太麻烦了。这次小编就教大家利用开机还原软件…