使用 Universal Links 和 App Links 实现深度链接
平台: iOS, Android
Universal Links(iOS)和 App Links(Android)提供了将用户直接引导至原生应用内特定内容的能力(通常称为深度链接)。
当用户点击深度链接时,用户会直接被引导至你的应用内,而无需先经过设备的网页浏览器或网站。如果应用未安装,则用户会被引导至网站。如果用户直接访问网站,他们将继续留在网站上。这使得深度链接成为为 Web、iOS 和 Android 构建的跨平台应用的极佳功能:无缝的移动体验,并优雅地回退到网站。
优点:
- 安全:Universal/App Links 使用指向你所拥有的网站域的 HTTPS URL,确保没有其他应用可以使用你的链接。
- 无缝体验:同一个 URL 同时适用于你的网站和应用,确保用户可以无错误地访问他们正在查找的内容。
- 提高参与度:链接可以从电子邮件客户端、搜索引擎结果等位置打开。
演示视频
以下是实际效果。在这个例子中,用户已安装原生应用。他们从电子邮件中点击应用链接,直接被带入应用本身 。首先,点击根链接(https://beerswift.app),将用户引导至主应用页面。接下来,点击一个深度链接(https://beerswift.app/tabs/tab3),将用户引导至 Tab3 页面。
前置条件
- 一个预先配置好的 Capacitor 应用。
- 对于 iOS,需要注册 Apple Developer Program。
为便于说明,本文将使用 https://beerswift.app 作为 Web 应用链接。
使用 Capacitor App API 进行深度链接路由
当点击深度链接后打开原生应用时,移动操作系统不会自动知道将用户路由到哪里。这需要在应用启动时,在应用内部使用 Capacitor App API 来实现。
如果你的网站和应用路径不匹配,则需要实现更高级的 URL 模式匹配(参见本指南中的示例)。不过,如果你的移动应用和 Web 应用使用相同的代码库,这就非常简单——只需重定向到相同的 URL 即可。以下示例均基于此假设。
Angular
路由应在 app.component.ts 中实现。首先从 Angular 导入 NgZone 和 Router,然后从 Capacitor 导入 App:
import { Component, NgZone } from '@angular/core';
import { Router } from '@angular/router';
import { App, URLOpenListenerEvent } from '@capacitor/app';
接下来,将 Router 和 NgZone 添加到构造函数中:
constructor(private router: Router, private zone: NgZone) {
this.initializeApp();
}
最后,监听 appUrlOpen 事件,并在找到深度链接时进行重定向:
initializeApp() {
App.addListener('appUrlOpen', (event: URLOpenListenerEvent) => {
this.zone.run(() => {
// 示例 URL: https://beerswift.app/tabs/tab2
// slug = /tabs/tab2
const slug = event.url.split(".app").pop();
if (slug) {
this.router.navigateByUrl(slug);
}
// 如果没有匹配,则不执行任何操作 - 让常规路由逻辑处理
});
});
}
React
React 有多种选择。一种方法是将 App API 监听器功能封装在一个新组件中,然后将其添加到 App.tsx 中。首先创建 AppUrlListener.tsx,然后导入 React Router 的 useHistory hook 以及 Capacitor App API:
import React, { useEffect } from 'react';
import { useHistory } from 'react-router-dom';
import { App, URLOpenListenerEvent } from '@capacitor/app';
接下来,定义 AppUrlListener 组件,监听 appUrlOpen 事件并在找到深度链接时进行重定向:
const AppUrlListener: React.FC<any> = () => {
let history = useHistory();
useEffect(() => {
App.addListener('appUrlOpen', (event: URLOpenListenerEvent) => {
// 示例 URL: https://beerswift.app/tabs/tab2
// slug = /tabs/tab2
const slug = event.url.split('.app').pop();
if (slug) {
history.push(slug);
}
// 如果没有匹配,则不执行任何操作 - 让常规路由逻辑处理
});
}, []);
return null;
};
export default AppUrlListener;
在 App.tsx 中,导入新的组件:
import AppUrlListener from './pages/AppUrlListener';
然后将其添加到 IonReactRouter 内部(或你的应用启动的任何位置,只需确保 History hook 可用即可):
const App: React.FC = () => {
return (
<IonApp>
<IonReactRouter>
<AppUrlListener></AppUrlListener>
<IonRouterOutlet>
<Route path="/home" component={Home} exact={true} />
<Route exact path="/" render={() => <Redirect to="/home" />} />
</IonRouterOutlet>
</IonReactRouter>
</IonApp>
);
};
Vue
VueJS 提供了一个与 Vue 原生集成的官方路由系统,称为 Vue Router。要使用 Vue Router 设置深度链接,请在你用于配置所有路由的文件(通常是 routes.js 或类似文件)中开始。
首先,我们从插件中导入 capacitor 的 App,以及 Vue 和 VueRouter。
import { App, URLOpenListenerEvent } from '@capacitor/app';
import Vue from 'vue';
import VueRouter from 'vue-router';
接下来,使用 Vue Router 配置你的路由(更多信息请参阅 Vue Router 入门)。
const router = new VueRouter({
routes: [],
});
建议使用 mode: history,这样你就不必处理 # 了。
让 Vue 知道你正在使用 Vue Router,并在 Vue 中注册该 router:
const VueApp = new Vue({
router,
}).$mount('#app');
最后,我们需要为深度链接注册我们的应用。为此,我们在 Capacitor App 上添加一个 appUrlOpen 事件监听器。Capacitor 会捕获该事件,然后我们将其交给 Vue Router 来导航到请求的页面。
App.addListener('appUrlOpen', function (event: URLOpenListenerEvent) {
// 示例 URL: https://beerswift.app/tabs/tabs2
// slug = /tabs/tabs2
const slug = event.url.split('.app').pop();
// 只有在存在 slug 时才推送到路由
if (slug) {
router.push({
path: slug,
});
}
});
创建网站关联文件
为了让 Apple 和 Google 允许深度链接打开你的应用,必须在你的网站和应用之间建立双向关联。需要为每个平台创建一个文件,并将其放在网站上的 .well-known 文件夹中,例如:https://beerswift.app/.well-known/。
继续查看 iOS 和 Android 配置详情。
iOS 配置
iOS 配置涉及创建网站关联文件以及配置原生应用以识别应用域。
你必须已注册 Apple Developer Program。