android 按钮跳转失败,记录一次Android Deeplink跳转失败问题修复

此文已由作者申国骏授权网易云社区发布。

欢迎访问

Android Deeplink实现

在Android中,Deeplnk通过声明Activity的intent-filter来实现对自定义url访问事件的捕捉。在有道背单词的项目中,我们需要通过前端分享词单的方式,将词单分享给别人,并通过点击前端页面收藏按钮,实现调起客户端收藏词单的功能。

从前端通过自定义url的方式调起客户端这个功能原来一直都没有什么问题,直到最近有部分用户反馈在某些浏览器下无法调起。下面我们来看一下分析查找问题的方法以及如何解决。

检查客户端deeplink配置

在AndroidManifest.xml文件中,对路由Activity配置如下:

android:name=".deeplink.RouterActivity"

android:configChanges="keyboardHidden|orientation|screenSize"

android:launchMode="singleTask"

android:theme="@style/Theme.Translucent">

android:host="youdao.com"

android:scheme="recite"

android:pathPattern=".*"/>

android:name="android.support.PARENT_ACTIVITY"

android:value=".home.ui.MainActivity" />

里面比较重要的部分是intent-filter中的data配置,检查后发现配置正常,可以正常拦截到 recite://youdao.com/.*的所有请求。

转到RouterActivity通过断点调试,发现并没有到达。从而可以确认是浏览器调起的时候发生了异常。

tips: adb 命令同样可以启动deeplink进行测试

6db4f342f422f9a23525e90e249356b8.png

分析浏览器对deeplink处理

通过用户反馈,主要集中是在UC和华为自带的浏览器点击前端页面的【收藏词单】无法调起有道背单词

同时我们在chrome上面发现通过deeplink只有第一次会跳转到应用,往后几次都是没有任何相应,确实有点百思不得其解。

经过查找资料,发现了chrome的一个对Android Intent处理的介绍

One scenario is launching an app when the user lands on a page, which you can achieve by embedding an iframe in the page with a custom URI-scheme set as the src, as follows: b77409a3da5906a62491319d72429694.png

b189d6cf19f32ea6b1f79908df0eca63.png

随后经过对前端代码debug,果然有走了这段逻辑

bb9087fe0da5abf7ba3281867c85a60c.png

证据确凿,可以找前端大神反馈了。经过了解,确实是之前有改动过这部分的代码,使用了iframe来处理deeplink的打开。处理的办法也相对简单,将iframe换成href来做跳转处理就可以了。

测试

最后我们对国内的浏览器试了一下deeplink是否生效

UC浏览器

会弹出一个应用打开提醒,如果用户本次没有【允许】操作,则浏览器下次会拦截打开应用行为,没有任何提醒,不知道这是一个bug还是故意为之。点击【允许】后可以跳转应用

48fbf467d978205fde80ef9c25859dd6.png

QQ浏览器

同样会弹出应用打开题型,如果用户本次没有【打开】,下次用户操作还是会继续提醒。点击【打开】后可以跳转应用

138ffd310d35f6a85cafea28a98df528.png

360浏览器

行为与QQ浏览器类似,每次都会提醒

854a4eea9dbe665c4aa123d0eae5103d.png

猎豹浏览器

行为与QQ浏览器类似,每次都会提醒

e8680929ba7766527d1e56c1991d2fef.png

一加系统默认浏览器

行为与QQ浏览器类似,每次都会提醒

d7e7be31ca4bf393327e83154d771665.png

搜狗浏览器

没有提醒,直接跳转到app

chrome

行为与搜狗浏览器类似,没有提醒,直接跳转app

测试结果除了UC浏览器第一次不点击跳转之后会跳转不了之外, 其他浏览器跳转app问题得到解决。

结语

通过这次查deeplink跳转的问题,收获了两点知识。

一个是前端使用iframe来处理deeplink跳转会有问题

二个是除了采用"scheme://host/path"这种deeplink方式之外,还可以采用"intent://about/#Intent;action=[string];scheme=[string];package=[string];S.browser_fallback_url=[encoded_full_url];end"的方式来触发应用intent的请求访问。

更多网易技术、产品、运营经验分享请点击。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值