使用Universal Links和App Links实现深度链接
支持平台:iOS, Android
Universal Links(iOS)和App Links(Android)能够让用户直接跳转到原生应用内的特定内容(通常称为深度链接)。
当用户点击深度链接时,系统会直接将用户带入您的应用,无需先经过设备浏览器或网站。如果应用未安装,则会跳转到网站。这种机制非常适合为Web、iOS和Android构建的跨平台应用:提供无缝的移动体验,同时优雅地回退到网页版。
优势:
- 安全性:使用您拥有的HTTPS域名链接,确保其他应用无法冒用您的链接
- 无缝体验:同一个URL同时适用于网站和应用,确保用户总能获取所需内容
- 提升参与度:链接可通过电子邮件客户端、搜索引擎结果等多种渠道打开
演示视频
以下是实际效果示例。用户已安装原生应用,点击邮件中的链接后直接进入应用。首先是根链接(https://beerswift.app)跳转到应用首页,然后是深度链接(https://beerswift.app/tabs/tab3)直达Tab3页面。
准备工作
- 已完成初始配置的Capacitor应用
- iOS开发需要加入Apple开发者计划
本文示例将使用https://beerswift.app作为Web应用链接。
使用Capacitor App API实现深度链接路由
当用户点击深度链接打开原生应用时,移动操作系统不会自动知道路由到哪个页面。这需要通过Capacitor App API在应用启动时实现。
如果您的网站和应用路径不一致,需要 实现更复杂的URL模式匹配(参考此指南)。如果使用相同代码库则非常简单,只需重定向到相同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
钩子和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钩子可用):
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 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并注册路由:
const VueApp = new Vue({
router,
}).$mount('#app');
最后注册深度链接监听器,捕获appUrlOpen
事件后交由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,
});
}
});
创建网站关联文件
为了让苹果和谷歌允许深度链接打开应用,需要在网站的.well-known
目录下创建双向关联文件(如:https://beerswift.app/.well-known/)。
请继续阅读iOS和Android的具体配置说明。
iOS配置
iOS配置包括创建网站关联文件和在原生应用中注册域名。
必须加入Apple开发者计划。
创建网站关联文件
首先登录Apple开发者网站,进入"Certificates, Identifiers, & Profiles"部分选择应用标识符。记下Team ID和Bundle ID,并在Capabilities中启用"Associated Domains":
然后创建网站关联文件apple-app-site-association
(注意:虽是JSON文件但不要加扩展名)。