突破Android微信微博浏览器限制直接拉起应用

前言

众所周知,微信微博等应用为了防止用户在使用过程当中跳出程序本身,对浏览器里面的自定义协议打开做了限制。这个需求很正常,是个产品经理都能想到。

但作为微博微信这种体量的应用来说,我要多说几句:“右上角使用浏览器打开”成了每个前端开发者的标配,可以说浪费了多少的人力和财力,亦可以说造就了多少的就业机会。APP做得越大,越应该有社会责任感。这种简单粗暴的方式让千千万万的开发者感到心痛,无语。请把选择权交还给用户,既然用户点开了浏览器,我们也理解你们为自己APP操碎了心,是否可以做成弹框再让用户选择:是否打开xx应用?

现状

H5页面增加自定义协议拉起APP在移动端来讲是个非常特色的交互,而且也可以极大提高用户体验,基本是每个应用的标配。通过

就可以在点击的时候触发拉起应用(前提是系统已经安装支持这个协议的应用,这个例子里面叫orpheus。

微信微博浏览器如何封禁自定义协议呢?

public booleanshouldOverrideUrlLoading(WebView view, String url)

Android的WebView控件有个叫shouldOverrideUrlLoading的回调,任何链接的打开(包括http和各种自定义协议)都会先走这个回调,交给应用本身来判断是否要接手处理,return

true表示接手,WebView就不再处理,否则WebView就继续处理。

处理自定义协议其实不是WebView自带的功能,而是需要开发者在这个回调里面去实现。比如类似这样:

Intent intent =newIntent(Intent.ACTION_VIEW, uri);

if(intent.resolveActivity(getPackageManager()) !=null) {

startActivity(intent);

}

那微信微博与其说拦截,倒不如说他们只判断了自己白名单的协议然后放行。

方法

除了苦逼的前端开发者实现个右上角用浏览器打开功能,还有一些思路可以参考。

1.伪装成白名单协议

我们知道微信有白名单,比如合作的京东就可以直接打开,所以我们可以把我们的应用做成京东的协议名称,这样如果用户手机上面没有安装京东,就能直接拉起你的应用。如果安装了京东,则会跳出弹框让用户选用哪个打开(这个是系统行为)。这个方案有点猥琐。

2.用右上角浏览器打开的时候可以把自己应用置顶。我们知道右上角用浏览器打开其实也是微信调用了上述那段代码,只不过协议固定是http或者https。当然微信还是做过修改的,第一个位置固定放QQ浏览器(即使没有安装)。除了第一个位置剩余是按系统读取的顺序排列的。因为Intent其实是有优先级的,那如何利用系统Intent优先级来让自己的应用在这个弹框里面排在第二位呢?

首先应用当然要实现支持http/https协议,不然你都不会出现在这个页面里面。然后给Intent配置域名信息,如下:

这样在自己域名匹配上面排列就会靠前。甚至你可以在这个协议实现上面,直接将http/https的url转换成native参数,直接打开native页面,省去中间webview跳转。

如果url转成native参数有点麻烦,你可以在分享链接的时候带上Intent.toUri作为参数,这样后续收到url之后直接Intent.parseUri得到Intent,跳转到指定页面就简单了。当然这种做法有限制,比如参数不能缺失,也不能支持其他平台分享过来的链接。如果应用的不同平台能统一跳转协议也是很不错的。

突破

还能再做点什么吗?答案是肯定的。这个突破不是绝对的,而必须要求程序在后台有个活着的进程。如果你感兴趣请继续往下看。

首先我们知道系统的很多弹框都是用Activity实现的,他可以弹出在任何应用的任意一个界面上面,说到底这个弹框也是属于系统的某个应用,比如手机管家等等。那为什么一个APP在后台能启动的一个Activity可以在任意另外一个APP上面呢?

秘密就在于Intent.FLAG_ACTIVITY_NEW_TASK这个flag,我们知道如果context.startActivity里面的context不是Activity,是必须要加这个flag才能启动成功。

第一个问题解决了,在android上面是有可能让我们的一个页面呈现在微信之上。那如何触发调用呢?聪明的你可能想到了,对,就是在H5页面上面给自己应用发请求。

在自己应用里面实现一个非常简单的HttpServer,接听来自本机的请求,一旦收到请求则直接使用Intent.FLAG_ACTIVITY_NEW_TASK拉起Activity。

可惜是当你去尝试在H5页面里面给127.0.0.1或者localhost发请求的时候发现根本收不到,因为狡猾的微信微博浏览器限制了这两个本机地址,限制方式也很简单,还是刚才的shouldOverrideUrlLoading判断下url的host是不是这2个就可以了。于是聪明的你肯定又想到了绕过的方式。没错随便弄个域名解析到127.0.0.1上面。

于是整个链路快要完成了,剩下就是一些额外的工作,比如客户端和H5页面约定一串端口,按照约定顺序依次遍历直到请求得到响应。因为端口有可能被占用。然后再约定一个加解密方式以防止被恶意攻击。

这种方式有没有可能被微信微博封禁呢?因为原理都是系统实现,唯一的可能点就是对域名进行解析发现还是127.0.0.1的话继续拦截。但这个做法有点代价,首先shouldOverrideUrlLoading不能阻塞调用,这样就影响正常使用了。如果做成异步的就需要新增一个dns查询服务,这个完全看xx产品经理的意思。可能原来不会考虑,这篇文章发出去了用的人多了估计会考虑了。。。请给开发者留一条活路。

写到这里我猜你肯定在想,程序活着这个条件是个硬伤,虽然多迈出了一步但还是受限不少。于是又引出了一个古老的话题:如何程序保活。这不是本篇文章的范畴,我也不推荐你去研究和花费心思,这也不是一个正确的方向。

最后给一个提示:你的公司有没有兄弟产品,亦或是有没有使用一个公共的SDK呢?

更多细节请参考我给的例子,点击这里可以参看。有任何问题欢迎留言讨论,喜欢就点赞,请支持原创。

更多文章请关注微信公众号:安卓之美

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容