Android外部调用自身App(scheme DeepLink、AppLink详解)

一、场景需求

APP开发中经常会有这种需求:在浏览器或者短信、别的App中唤起自身APP。

二、提前小总结

如果不是硬性业务需要AppLink,那么DeepLink完全满足。
AppLink在国内还有一个严重的问题,就是需要翻墙才能正常使用。(这个问题很多网站没提到踩到坑)

二、介绍

Android一直是支持scheme的,URI Schemes其实就是实现Deep Link的第一代解决方案,后来随着诸多缺点的出现,比如

  • 当要被唤起的app没有安装时,这个链接就会出错。(这个可以提前通过代码解决)
  • 当注册有多个scheme相同的时候,目前没有办法区分。

为了解决上面问题,于是,就出现了Android6.0之后的App Link,其实App Link比Deep Link多了一种验证方式,需要App与Web协作完成系统验证,并且Manifest文件中需要加入android:autoVerify="true",其他的就没什么代码变动了
请记住,如果App Link验证通过,就设置默认打开,如果验证不过,则退化为Deep Link

三、区别

关键字 注释
不同点 DeepLink AppLink
Intent scheme 任意 要求http或https
Intent action 任意 要求配置andorid.intent.action.VIEW
Intent category 任意 要求配置android.intent.category.BROWSABLE和android.intent.category.DEFAULT
链接认证 无需验证 要求进行Digital Asset Links文件验证
用户体验 可能展示一个多选项弹窗或确认弹窗,用户需要二次选择或确认 无弹窗,直接由App处理链接
兼容性 所有版本 Android6.0及以上版本

四、一些细节你要了解的

  • App可以配置多个支持唤起的Activity
  • Activity可以支持被多个URL唤起
  • 若一个App配置了多个支持唤起的Activity,它们的scheme和host一般一致,然后通过path、pathPrefix等进行定向区分

五、DeepLink实践

四.1 首先,需要在AndroidManifest.xml文件进行配置
        <!-- 用于不做任何处理的调用跳转 -->
        <activity
            android:name=".phone.entry.EntryActivity"
            android:launchMode="singleTask"
            android:exported="true"
            android:screenOrientation="portrait">

            <intent-filter android:autoVerify="true">
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="wx.test.com"
                    android:scheme="wx" />
            </intent-filter>
        </activity>
配置项作用:
关键字 注释
ACTION_VIEW 支持被检索
CATEGORY_DEFAULT 响应隐式Intent
CATEGORY_BROWSABLE 可被Web浏览器唤起
data 一个或多个,必须含有scheme标签,决定被唤起的URL格式。
四.2 然后,被唤起后的Activity解析URL数据
@Override 
public void onCreate(Bundle savesInstanceState){
 ...
  Intent intent=getIntent();
  String action=intent.getAction();
  Uri data=intent.getData();
  // 解析data
  String scheme=data.getScheme();
  String host=data.getHost();
  String path=data.getPath();
  int port=data.getPort();
  Set<String> paramKeySet=data.getQueryParameterNames();
  ...
}
四.3 URL基本格式

wx://wx.test.com?uid=123&name=Ming

四.4 唤起方
        String url = "wx://wx.test.com";
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        MainActivity.this.startActivity(intent);

六、为什么第三方调用我的Activity会重启?

场景:自身App启动,然后调用第三方应用,这个时候第三方再调回我们自身App,如果没有设置singleTask模式,那么会重新启动我们的App
这是因为没有设置android:launchMode="singleTask"
那么问题又来了,业务需求我的这个Activity是不能设置SingleTask,那么,我们就要做一个类似入口的Activity
···
public class EntryActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Uri uri = getIntent().getData();
    ``````
    finish();
}

}
···
那么当EntryActivity自己finish后,就会回到上一个页面中。

七、AppLink

在上面说了,需要App与Web协作完成系统验证。在上面我们已经创建了EntryActivity的入口,接下来就具体几个步骤

  • 点击Android Studio的菜单栏中的Tools > App Links Assistant



    在右侧界面会看到几项,那么我们一项一项说

  • 打开第一项,即是Open URL Mapping Editor



    可以看到我们之前添加的EntryActivity,在这里我们可以随意添加修改都会影响到Manifest文件
    App Links Assistant提供了检查URL Mapping是否配置正确的快捷方式,操作如下:
    点击Open URL Mapping Editor,然后在Check URL Mapping对话框中输入URL,当输入一个能够成功匹配到Acitivty的URL后,输入框下方会显示This URL maps to xxxxx(app)

  • 打开第二项,如图,只是让你更快进入Activity代码


  • 第三项,就是AppLink设置的重点了


选项标题 解释
Select a module yout want to work on 项目里面有多个App的时候就会出现,让你选择其中一个
Site domain 自己后台搭建的网址,需要提供出来验证
Application ID App包名
Signing config 选择密钥,可以看出debug跟release是不一样的
Generate Digital Asset Links file 点击后生成Preview的下文

当我们生成Preview的文章后,作为一个assetlinks.json的文件存储进该路径
https://link.applk.cn/.well-known/assetlinks.json
请记得,打开这个链接,是一个自动下载的文件才是对的

八、如何验证AppLink是否成功

那么基本完成了,那么我们如何验证是否成功呢?首先,第四项就提供了验证功能


那么除了这个方法,还有别的方式验证,比如
Statement List Generator and Tester | Google Digital Asset Links

那么基本就结束了,踩过的坑也都在这个文章上写了如何避免

如果能帮到你,请记得给star更多动力咯

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

推荐阅读更多精彩内容