-
Notifications
You must be signed in to change notification settings - Fork 0
docs: add SEO optimization guide for SeeForMe #11
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,3 +1 @@ | ||
| /backend/.env* | ||
|
|
||
| /docs | ||
| /backend/.env* |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,313 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # SeeForMe SEO 优化实战指南 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| > 适用版本:Expo (React Native) + FastAPI | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| > 目标:让 Google / Bing / 百度等搜索引擎抓取到产品,提升自然流量与品牌曝光。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| --- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ## 一、核心思路 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 移动 App 本身无法被搜索引擎直接抓取,SEO 的本质是**在 Web 端建立可被爬虫索引的入口**,再通过 App Store / Google Play 的 ASO(应用商店优化)覆盖搜索流量。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 两条并行主线: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| | 方向 | 效果 | 优先级 | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |------|------|--------| | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| | 应用商店优化 (ASO) | 应用内搜索 + 商店首页推荐 | ⭐⭐⭐⭐⭐ | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| | Web 落地页 SEO | Google 自然搜索排名 | ⭐⭐⭐⭐ | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| | Expo Web 路由 SEO | 用户分享链接可被收录 | ⭐⭐⭐ | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| --- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ## 二、应用商店优化(ASO) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ### 2.1 标题与副标题 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - **App Store(iOS)** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - 标题(30 字符限制):`为你所见 · 盲人视觉助手` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - 副标题(30 字符):`实时志愿者视频陪伴服务` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - **Google Play(Android)** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - 标题(50 字符):`为你所见 SeeForMe - 视障人士视觉助手` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - 简介(80 字符):`连接志愿者,让视障者实时"看见"世界` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| > 规则:标题中包含核心关键词,但不可堆砌。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ### 2.2 关键词策略 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 优先布局在**描述前三行(可见区域)**和关键词字段(仅 App Store 有 100 字符关键词字段): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 主关键词(高意图): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - 盲人辅助工具 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - 视障助手 App | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - 盲人视频通话志愿者 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 长尾关键词(低竞争): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - 视觉障碍日常生活帮助 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - 公益志愿者帮助盲人 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - 实时视频描述场景 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ### 2.3 描述文案(完整描述 4000 字符) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 第一段(前三行必须吸引眼球,无需展开就能看到): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 当你需要时,有人替你看见。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| SeeForMe 连接有需要的视障朋友与热心志愿者, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 通过实时视频,志愿者帮你描述周围的世界——无论是读菜单、 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 看路牌、还是感受草原的辽阔。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ### 2.4 截图与预览视频 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - 截图数量:**iOS 最多 10 张,Android 最多 8 张** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - 前 3 张放最核心功能截图,配上中文说明文字 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - 拍摄 **30 秒预览视频**:展示发起求助 → 志愿者接单 → 实时视频描述全流程 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - 文件格式:PNG(截图)/ MP4(视频) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ### 2.5 评分与评论 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - 在用户完成一次成功的志愿服务后弹出评分请求(`expo-store-review`) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - 目标:保持 4.5 星以上 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - 及时回复差评,展示团队活跃度 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| --- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ## 三、Web 落地页 SEO | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| > 落地页是搜索引擎抓取的主要入口,建议独立部署(如 Vercel / Cloudflare Pages)或复用 Expo Web 构建。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ### 3.1 页面结构(最小可行) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| / (首页) ← 核心关键词着陆页 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /about ← 项目介绍 + 团队 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /how-it-works ← 功能说明(志愿者视角 / 求助者视角) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /volunteer ← 志愿者招募页(转化页) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /blog ← SEO 内容输出(长期) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /sitemap.xml ← 站点地图 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /robots.txt ← 爬虫规则 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| > 在当前技术栈中,这些 URL 需要在 Expo Router 中对应到 `frontend/app` 目录下的路由文件。例如: | |
| > | |
| > ```tsx | |
| > frontend/ | |
| > app/ | |
| > index.tsx // 对应 / | |
| > about.tsx // 对应 /about | |
| > how-it-works.tsx // 对应 /how-it-works | |
| > volunteer.tsx // 对应 /volunteer | |
| > blog/ | |
| > _layout.tsx // 博客列表/布局 | |
| > [slug].tsx // 对应 /blog/任意文章 | |
| > ``` | |
| > | |
| > 更多文件路由示例可参考 Expo Router 文档:<https://docs.expo.dev/routing/introduction/> |
Copilot
AI
Feb 24, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The guide uses placeholder domain "https://seeforme.app" throughout all examples (og:image, og:url, canonical links, sitemap, etc.). Before implementing these SEO recommendations, the actual production domain needs to be determined and all instances should be updated accordingly. Consider adding a note at the beginning of the document stating that "seeforme.app" is a placeholder and should be replaced with the actual domain.
Copilot
AI
Feb 24, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The guide also references "expo-router/head" here. As mentioned earlier, the correct import path for expo-router v6 is import { Head } from "expo-router"; not from a /head subpath.
| Expo Router 支持通过 `expo-router/head` 在每个路由文件里设置 `<head>` 内容: | |
| Expo Router 支持通过 `Head` 组件(从 `expo-router` 导入)在每个路由文件里设置 `<head>` 内容: |
Copilot
AI
Feb 24, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The guide shows importing Head from "expo-router/head", but in expo-router v6 (which is installed), the Head component should be imported from "expo-router" directly, not from a /head subpath. The correct import should be: import { Head } from "expo-router";
Additionally, note that Head is primarily meant for setting document metadata on web, and the code example correctly wraps it in a Platform.OS === "web" check, which is good practice.
| import { Head } from "expo-router/head"; | |
| import { Head } from "expo-router"; |
Copilot
AI
Feb 24, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The code snippet shows a JSX fragment without proper context of where it should be placed in the component. The comment says "在 RootLayout 返回值中加入" (add to RootLayout return value), but the example doesn't show the complete component structure.
For clarity, the complete pattern should show that the <Head> component needs to be added as a child within the existing component tree. Based on the current _layout.tsx structure, it could be added before or after the <GestureWrapper> component, or inside it depending on the desired scope.
| import { Head } from "expo-router/head"; | |
| import { Platform } from "react-native"; | |
| // 在 RootLayout 返回值中加入(只在 web 渲染): | |
| {Platform.OS === "web" && ( | |
| <Head> | |
| <meta name="description" | |
| content="SeeForMe 是一款公益 App,通过实时视频让志愿者帮助视障人士感知世界。" /> | |
| <meta property="og:image" content="https://seeforme.app/og-cover.png" /> | |
| <link rel="canonical" href="https://seeforme.app" /> | |
| </Head> | |
| )} | |
| import { Stack } from "expo-router"; | |
| import { Head } from "expo-router/head"; | |
| import { Platform } from "react-native"; | |
| export default function RootLayout() { | |
| return ( | |
| <> | |
| {/* 在 RootLayout 返回值中加入(只在 web 渲染) */} | |
| {Platform.OS === "web" && ( | |
| <Head> | |
| <meta | |
| name="description" | |
| content="SeeForMe 是一款公益 App,通过实时视频让志愿者帮助视障人士感知世界。" | |
| /> | |
| <meta property="og:image" content="https://seeforme.app/og-cover.png" /> | |
| <link rel="canonical" href="https://seeforme.app" /> | |
| </Head> | |
| )} | |
| {/* 其余路由与页面内容 */} | |
| <Stack /> | |
| </> | |
| ); | |
| } |
Copilot
AI
Feb 24, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The JSON-LD structured data includes hardcoded rating values ("ratingValue": "4.8", "reviewCount": "120") that don't reflect actual app ratings. These should either be:
- Removed until the app has real ratings to report, or
- Clearly marked as placeholder values that need to be updated with actual data
Using fake ratings in structured data could be considered misleading and may violate search engine guidelines. It's better to omit the aggregateRating field entirely until there are real reviews.
| }, | |
| "aggregateRating": { | |
| "@type": "AggregateRating", | |
| "ratingValue": "4.8", | |
| "reviewCount": "120" |
Copilot
AI
Feb 24, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The Core Web Vitals thresholds mention "FID < 100ms" (First Input Delay), but as of mid-2024, Google has replaced FID with INP (Interaction to Next Paint) as a Core Web Vital. The good threshold for INP is < 200ms. Consider updating this to reflect the current Web Vitals: LCP < 2.5s, INP < 200ms, CLS < 0.1
| | Core Web Vitals | LCP < 2.5s,FID < 100ms,CLS < 0.1 | Google Search Console | | |
| | Core Web Vitals | LCP < 2.5s,INP < 200ms,CLS < 0.1 | Google Search Console | |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The guide references
expo-store-reviewpackage for rating prompts, but this package is not installed infrontend/package.json. Before this feature can be implemented, the package needs to be added as a dependency. Consider adding it with:pnpm add expo-store-review