cordova-wtto00-universal-link
v1.0.1
Published
Cordova plugin to add in your application support for Universal Links (iOS 9) and Deep Links (Android). Basically, open application through the link in the browser.
Downloads
1
Maintainers
Readme
cordova-wtto00-universal-link
参考 e-imaxina/cordova-plugin-deeplinks
- 🌟 支持 Android 13
- 🌟 添加 Types 定义
- 🐛 修复了一些在最新版本 SDK 上面出现的问题
官方文档
用法
- 安装插件 (查看 安装).
- 在
config.xml
中配置链接 (查看 Cordova 配置). - 监听链接启动事件 (查看 监听链接启动事件).
- web 集成 (查看 安卓 web 集成 和 iOS-web 集成).
- 启动项目,本地测试 (查看 安卓本地测试 和 iOS 本地测试).
支持平台
- Android 4.0.0 或以上。
- iOS 9.0 或以上。
安装
cordova plugin add cordova-wtto00-universal-link
Cordova 配置
项目根目录下的config.xml
。
示例:
<universal-links>
<host name="example.com">
<path url="/some/path/*" />
</host>
</universal-links>
host
<host />
标签表示 universal link 的主机信息
name
- 域名,必填。scheme
- 协议http
或者https
. 默认是http
。event
- 链接启动 APP 后,在 APP 中监听的事件名称。默认事件名称是:didLaunchAppFromLink
示例:
<universal-links>
<host name="example.com" scheme="https" event="my_launch_event_name" />
</universal-links>
这个示例表示,用户浏览器进入 https://example.com
后,将会打开 APP,然后在 APP 中触发监听的 ul_myExampleEvent
事件。详情查看 监听链接启动事件.
你还可以使用域名通配符:
<universal-links>
<host name="*.users.example.com" scheme="https" event="my_launch_event_name_from_user" />
<host name="*.example.com" scheme="https" event="my_launch_event_name" />
</universal-links>
path
<path />
标签定义主机域名下的哪些路径将被响应打开 APP。如果没有 path
标签,则响应所有的路径。
url
- 路径地址 This is a required attribute.event
- 链接启动 APP 后,在 APP 中监听的事件名称。空缺的话,将会触发父级host
标签上定义的事件名称。
多个 path
标签,可以对与不同的链接路径,监听不同的处理事件。
示例:
<universal-links>
<host name="example.com">
<path url="/some/path" event="my_launch_event_for_this_path" />
</host>
</universal-links>
当浏览器访问 http://example.com/some/path
时,将打开 APP。该域名下的所有其他链接都将被忽略,不会响应。
注意:url 的 query 参数不会计入匹配规则中。即 http://example.com/some/path?foo=bar#some_tag
一样可以正常响应。
如果想要支持 /some/path/
后面的所有子路径,你可以使用 *
通配符。
比如:
<universal-links>
<host name="example.com">
<path url="/some/path/*" />
</host>
</universal-links>
*
通配符用在 path 标签的 url 路径时,可以放在路径的任意位置。
比如:
<universal-links>
<host name="example.com">
<path url="*mypath*" />
</host>
</universal-links>
这个配置将会响应以下示例:
http://example.com/some/long/mypath/test.html
http://example.com/testmypath.html
等等...
ios-team-id
ios-team-id
标签用于生成 iOS 配置文件 apple-app-site-association
。
当使用 CLI 构建项目时,本插件会自动在 ul_web_hooks
目录中生成用于上传到服务器的配置文件 apple-app-site-association
示例:
config.xml
:
<widget id="com.example.ul" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<!-- some other cordova preferences -->
<universal-links>
<ios-team-id value="1Q2WER3TY" />
<host name="mysite.com" >
<path url="/some/path/*" />
</host>
</universal-links>
</widget>
将会生成配置文件 apple-app-site-association
:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "1Q2WER3TY.com.example.ul",
"paths": ["/some/path/*"]
}
]
}
}
该标签作用仅仅是生成这个 iOS 的配置文件。不影响打包运行。Android 会忽略此配置。
阻止安卓生成多个 APP 实例
当通过 universal link 打开安卓 APP 时,安卓默认会重新生成一个新实例,即使 APP 已经在运行中。
为了解决此问题,需要在 config.xml
文件中配置单例模式:
<preference name="AndroidLaunchMode" value="singleInstance" />
监听链接启动事件
仅仅是打开 APP 是不够的,你需要获得打开 APP 的链接地址,然后根据链接地址以及参数,做各种不同的逻辑处理。universalLinks
变量已挂载在全局变量 window
下,可以直接使用,并且在 Typescript
中也定义了类型。
注意: 监听事件,必须在 cordova
生命周期的 deviceready
事件后执行,即 document.addEventListener("deviceready",callback, false);
中的回调 callback
中注册监听事件。
示例:
universalLinks.subscribe('eventName', function (eventData) {
// do some work
console.log('Did launch application from the link: ' + eventData.url)
})
如果你没有在 config.xml
中配置 eventName
, 则可以使用默认的事件名称 didLaunchAppFromLink
。
universalLinks.subscribe('didLaunchAppFromLink', function (eventData) {
// do some work
console.log('Did launch application from the link: ' + eventData.url)
})
eventData
参数是打开 APP 的链接地址。
比如: 对于 http://myhost.com/news/ul-plugin-released.html?foo=bar#cordova-news
eventData
将会是如下的数据:
{
"url": "http://myhost.com/news/ul-plugin-released.html?foo=bar#cordova-news",
"scheme": "http",
"host": "myhost.com",
"path": "/news/ul-plugin-released.html",
"params": {
"foo": "bar"
},
"hash": "cordova-news"
}
如果你想,你还可以取消监听该事件,如下所示:
universalLinks.unsubscribe('eventName')
web-集成
前端方面的已基本完成了,接下来你需要在后端服务器上面做一些配置。
假如你在 config.xml
中是这样配置的:
<universal-links>
<ios-team-id value="1Q2WER3TY" />
<host name="mysite.com" scheme="https" >
<path url="/some/path/*" />
</host>
</universal-links>
安卓 web 集成
在服务器上传配置文件
按照上面的
config.xml
示例,你需要在mysite.com
域名所解析的服务器上的根目录中,创建.well-known
目录,并在该目录下,创建文件assetlinks.json
,内容如下:[ { "relation": ["delegate_permission/common.handle_all_urls"], "target": { "namespace": "android_app", "package_name": "<PACKAGE_ID>", "sha256_cert_fingerprints": ["<SHA256_CERT_FINGERPRINTS>"] } } ]
详情可查看 官方说明
<PACKAGE_ID>
: 你的包名。<SHA256_CERT_FINGERPRINTS>
: 应用的签名证书的 SHA256 指纹。可以通过以下命令获得。keytool -list -v -keystore my-release-key.keystore # 14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5
确认配置文件有效性
按照上面的配置示例:https://mysite.com/.well-known/assetlinks.json
该链接应该能够正常访问或可以下载。https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://mysite.com&elation=delegate_permission/common.handle_all_urls
该链接应该能返回配置的正确信息。
注意:测试链接,请更换为自己的配置信息。
在链接
html
页面上添加信息<link rel="alternate" href="android-app://<PACKAGE_ID>/<SCHEME>/<HOST><PATH>" />
<PACKAGE_ID>
: APP 包名。<SCHEME>
:config.xml
中配置的host
标签协议。<HOST>
:config.xml
中配置的host
标签域名。<PATH>
:config.xml
中配置的host
中子元素path
标签地址。假如配置多个path
标签,则需要有多个对应的link
标签。
config.xml
中配置后,通过 CLI 启动命令cordova prepare android
会自动在项目根目录下的ul_web_hooks/android
目录中生成一个android_web_hook.html
文件。可以拷贝其中的link
标签,粘贴到自己网站页面的html
中。在其他页面手动触发打开 APP
如果你想在任意的其他页面,手动触发打开 APP,
- 可以使用
a
标签即:<a href="android-app://<PACKAGE_ID>/<SCHEME>/<HOST><PATH>">打开APP</a>
。 - 或者使用重定向:
window.location.href = 'android-app://<PACKAGE_ID>/<SCHEME>/<HOST><PATH>'
- 可以使用
iOS-web 集成
在服务器上上传配置文件
按照上面的
config.xml
示例,你需要在mysite.com
域名所解析的服务器上的根目录中,创建.well-known
目录,并在该目录下,创建文件apple-app-site-association
,内容如下:{ "applinks": { "apps": [], "details": [ { "appID": "<TEAM_ID_FROM_MEMBER_CENTER>.<BUNDLE_ID>", "paths": ["/some/path/*"] } ] } }
也可以直接在根目录中创建该文件,
.well-known
目录可省略。<TEAM_ID_FROM_MEMBER_CENTER>
: 开发者 team_id。<BUNDLE_ID>
: APP 包名。
config.xml
中配置后,通过 CLI 启动命令cordova prepare ios
会自动在项目根目录下的ul_web_hooks
目录中生成文件<hostname>#apple-app-site-association
。可改名后直接上传到自己的域名服务器中。确认配置文件有效性
按照上面的配置示例:https://mysite.com/.well-known/apple-app-site-association
或者https://mysite.com/apple-app-site-association
该链接应该能够正常访问或可以下载。https://app-site-association.cdn-apple.com/a/v1/mysite.com
该链接应该能返回配置的正确信息。
注意:测试链接,请更换为自己的配置信息。
Associated Domains
注意: 在
apple
开发者中心创建,在xcode
中打包,所使用的证书,应该包含此功能选项。
启动项目
现在万事具备了,启动项目,开始测试吧。
安卓本地测试
启动项目
cordova run android
在设备上,关闭刚刚安装打开的 APP
在终端中执行:
adb shell am start -W -a android.intent.action.VIEW -d "<URL>" <PACKAGE_ID>
<URL>
: 响应的链接地址。按照上面的示例,应该是:http://mysite.com/some/path/
。<PACKAGE_ID>
: APP 包名。 注意: 更换为自己的配置信息。
没有出错的话,设备上应该直接打开了你正在开发的 APP。
ios 本地测试
启动项目
cordova run ios
在设备上,关闭刚刚安装打开的 APP
在设备上,打开
safari
,输入地址http://mysite.com/some/path/
并访问。
注意: 更换为自己的配置信息。
没有出错的话,设备上应该直接打开了你正在开发的 APP。