OpenDeepLink协议

最低版本: 1.20.0最后更新: 2020/3/20

OpenDeepLink协议是一种URL协议。OpenDeepLink协议可以用来打开机器人上的APK、OPK、微信小程序和H5,以及它们的特定页面。例如下面这个用于打开OPK的OpenDeepLink

robotos://ACA2CF89-ADF7-469A-ACD8-B27BB8D934BF/main?name=xiaoming&age=10

 

OpenDeepLink结构

OpenDeepLink形式的Url,其格式如下

scheme:[//authority]path[?query]

 

字段打开 OPK打开 APK打开小程序打开 H5
schemerobotosandroidoswmpfoswebos
authorityOPK的AppIdAPK的包名微信小程序的AppId固定:redirection
pathOPK 中的页面Activity 的具体名字小程序中的页面不支持
query传递给 OPK 的参数传递给 Activity 的参数有限参数:isNativeView 等固定格式:target=[url]

 

OpenDeepLink的工作方式

Client 和 Target

应用可以作为一个 Client,通过OpenDeepLinkManager打开一个OpenDeepLink,来打开其他的OPK、APK、微信小程序,如果平台本身无法打开这种OpenDeepLink,则会让其作为Android原生的DeepLink分发出去。

应用也可以被其他应用通过OpenDeepLink打开,这个时候应用是作为一个 Target, 被打开的时候可以获取到OpenDeepLink携带的信息。

OpenDeepLink的使用

作为Client打开一个OpenDeepLink

在OPK中打开一个OpenDeepLink

需要在代码中导入DeepLinkManager后,通过其openDeepLink即可触发一个OpenDeepLink:

OpenDeepLinkManager.openDeepLink("robotos://app_id/skill")

    .then(console.log)

    .catch(console.error)

 

在APK中打开一个OpenDeepLink

需要通过发送广播的形式,触发一个OpenDeepLink:

kotlin

context.sendBroadcast(Intent("com.ainirobot.moduleapp.DEEP_LINK").apply {

  putExtra("deeplink", "robotos://appid/path")

})

java

Intent intent = new Intent("com.ainirobot.moduleapp.DEEP_LINK");

intent.putExtra("deeplink", "robotos://appid/path")

 

在H5网页中打开一个OpenDeepLink

在机器人上展示的网页中,我们可以通过下面的方式触发一个OpenDeepLink:

<p>
OpenDeepLink
</p>
<a href="robotos://app_id/main?name=shaw">打开OPK</a>
<p>

作为Target被OpenDeepLink打开

OPK被打开

如果OPK在未被加载时被OpenDeepLink打开,我们称之为冷启动,可以在 App.js 中的 props 里获取OpenDeepLink携带的数据,参考如下:

const protocol = props.protocol;
const deepLink = JSON.parse(protocol).deeplink;
if(deepLink){
   const {path, query} = deepLink;
   // TODO 基于自己的业务,做分发处理
}

如果OPK在已经加载过得情况下被OpenDeepLink触发,我们称之为热启动,可以在 CharacterTrigger recovery 方法中获取到OpenDeepLink携带的数据,参考如下:

public recovery = (params: any): void => {
   console.log(TAG, 'recovery', params, JSON.stringify(params));
   if (params.bundle_param) {
       const deepLink = JSON.parse(params.bundle_param).deeplink;
       if (deepLink) {
           const { path, query } = deepLink;
           // TODO 基于自己的业务,做分发处理
       }
   }
};

 

APK被打开

如果一个APK被OpenDeepLink打开,其行为和被Android原生的Intent打开并没有区别,也可以从其启动Intent中获取到OpenDeepLink中携带的数据。

如果是下面这个OpenDeepLink

androidos://com.example.lunch/com/example/lunch/OtherActivity?name=xiaoming&age=10

则可以在APK的Activity用如下方式取出数据:

val name = intent.getStringExtra("name") // name = xiaoming
val age = intent.getStringExtra("age")   // age = 10

 

已支持的协议

打开OPK

格式:

robotos://app_id/path?query

参考:

"robotos://music_11185dd28f0/playlist?singer=robot&limit=10"

打开APK

格式:

androidos://packageName/activityName?query

参考:

# 打开默认入口,类似Android系统的Launcher
"androidos://com.example.lunch"
# 打开特定的Activity
"androidos://com.example.lunch/com/example/lunch/OtherActivity?name=robot"

打开微信小程序

格式:

wmpfos://app_id/path?query

由于微信小程序本身的能力有限,query中的参数只是作为启动小程序时对小程序环境的配置,而不是传递给要启动的小程序。因此只能支持有限的参数:

参数说明
isNativeView是否需要 NativeView
appType0: 正式版 1: 开发版
forceRequestFullscreentrue 则强制小程序全屏运行

参考:

"wmpfos://order/main?appType=0"