OpenDeepLink协议
最低版本: 2.0.0最后更新: 2020/10/21支持平台:
平台 | 是否支持 |
豹小秘 | 否 |
豹大/花瓶 | 否 |
豹小秘 Mini | 是 |
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 |
scheme | robotos | androidos | wmpfos | webos |
authority | OPK的AppId | APK的包名 | 微信小程序的AppId | 固定:redirection |
path | OPK 中的页面 | 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 |
appType | 0: 正式版 1: 开发版 |
forceRequestFullscreen | true 则强制小程序全屏运行 |
参考:
"wmpfos://order/main?appType=0"