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更多动力咯

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容