发送推送通知
推送通知是任何移动应用的重要组成部分。它们允许您在用户未使用应用时向其发送通知。本指南将展示如何从Supabase边缘函数向不同移动应用框架发送推送通知。
Expo让推送通知的实现变得简单。所有关于设备信息以及与Firebase云消息(FCM)或苹果推送通知服务(APNs)通信的复杂操作都在后台处理。这使得您可以统一处理Android和iOS通知,节省前后端开发时间。
示例代码可在GitHub找到。
Supabase设置
- 创建新Supabase项目
- 链接项目:
supabase link --project-ref your-supabase-project-ref
- 本地启动Supabase:
supabase start
- 推送数据库模式:
supabase db push
(模式定义在supabase/migrations)
Expo设置
要使用Expo的推送通知服务,您需要安装一系列库、实现通知处理函数,并为Android和iOS设置凭证。按照官方Expo推送通知设置指南获取Android和iOS凭证。本项目使用Expo的EAS构建服务简化此过程。
- 安装依赖:
npm i
- 创建新Expo项目
- 链接应用到项目:
npm install --global eas-cli && eas init --id your-expo-project-id
- 为物理设备创建构建
- 启动开发服务器:
npx expo start --dev-client
- 用物理设备扫描终端显示的二维码
- 注册/登录以在Supabase Auth中创建用户
推送通知增强安全性
- 访问Expo访问令牌设置
- 为Supabase边缘函数创建新令牌
- 启用"推送通知增强安全性"
- 创建本地
.env
文件:cp .env.local.example .env.local
- 在新创建的
.env.local
文件中设置EXPO_ACCESS_TOKEN
值
部署Supabase边缘函数
发送推送通知的数据库webhook处理程序位于supabase/functions/push/index.ts。将函数部署到链接的项目并设置EXPO_ACCESS_TOKEN
密钥。
supabase functions deploy push
supabase secrets set --env-file .env.local
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748import { createClient } from 'jsr:@supabase/supabase-js@2'console.log('Hello from Functions!')interface Notification { id: string user_id: string body: string}interface WebhookPayload { type: 'INSERT' | 'UPDATE' | 'DELETE' table: string record: Notification schema: 'public' old_record: null | Notification}const supabase = createClient( Deno.env.get('SUPABASE_URL')!, Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!)Deno.serve(async (req) => { const payload: WebhookPayload = await req.json() const { data } = await supabase .from('profiles') .select('expo_push_token') .eq('id', payload.record.user_id) .single() const res = await fetch('https://exp.host/--/api/v2/push/send', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${Deno.env.get('EXPO_ACCESS_TOKEN')}`, }, body: JSON.stringify({ to: data?.expo_push_token, sound: 'default', body: payload.record.body, }), }).then((res) => res.json()) return new Response(JSON.stringify(res), { headers: { 'Content-Type': 'application/json' }, })})
创建数据库webhook
访问Supabase仪表板的数据库Webhook设置。
- 启用并创建新hook
- 触发条件:选择
notifications
表并勾选Insert
事件 - Webhook配置:选择Supabase边缘函数
- 边缘函数:选择
push
函数,方法保持POST
,超时设为1000
- HTTP头:点击"添加新头">"添加服务密钥认证头",保持内容类型为
application/json
- 点击"创建webhook"
发送推送通知
- 访问Supabase仪表板的表编辑器
- 在
notifications
表中插入新行 - 见证奇迹发生 🪄