Install
$ agentstack add skill-111pointer111-claude-marketplace-flutter-ios-code-review ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ● Environment & secrets Used
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
Flutter iOS 应用代码审查 Skill
触发条件
当用户发送以下类似消息时自动激活:
- "帮我审查代码"
- "代码审查"
- "review 我的项目"
- "检查代码问题"
- "审查 Flutter 项目"
- "帮我看看这个项目有没有问题"
- "代码有没有安全隐患"
审查范围
对 Flutter + iOS + Supabase 架构的应用进行全方位上线前审查,涵盖以下 5 个维度:
- iOS 发布配置安全 — Info.plist、Entitlements、Podfile、签名配置
- Flutter 代码架构与质量 — 状态管理、错误处理、安全性、内存泄漏
- Supabase 后端安全 — RLS 策略、Edge Function 输入验证、速率限制
- 依赖管理与可维护性 — 包版本、unused 依赖、Flutter SDK
- 文档与合规 — README、隐私政策、App Store 配置、LICENSE
审查流程
步骤 1:项目扫描(并行)
读取以下关键文件:
pubspec.yaml
lib/main.dart
lib/app.dart
analysis_options.yaml
ios/Runner/Info.plist
ios/Runner/Release.entitlements (如果存在)
ios/Podfile
ios/Flutter/Release.xcconfig
ios/Flutter/Generated.xcconfig
ios/Runner.xcworkspace/xcuserdata/** (检查 .xcuserstate)
android/app/src/main/AndroidManifest.xml
eas.json
.gitignore
.env.example (如果存在)
步骤 2:代码层审查(并行)
对 lib/ 目录下所有 Dart 文件审查:
lib/main.dart— Supabase 初始化、凭证管理lib/features/**/providers/*.dart— Riverpod 状态管理规范lib/features/**/data/repositories/*.dart— 数据层安全性lib/features/**/presentation/screens/*.dart— UI 层问题lib/shared/widgets/*.dart— 共享组件lib/core/**/*.dart— 常量、主题、工具类
步骤 3:后端安全审查(并行)
Supabase MCP 工具查询:
mcp__supabase__list_tables— 获取所有表mcp__supabase__execute_sql— 查询 RLS 策略mcp__supabase__list_edge_functions— 列出所有 Edge Function
审查 supabase/ 目录下的所有 Edge Function 代码:
supabase/functions/**/index.ts— 输入验证、速率限制、API 调用
步骤 4:依赖审查
执行命令:
cd
flutter pub outdated
dart pub outdated
flutter analyze
步骤 5:合规审查
读取文档目录:
README.mdLICENSECHANGELOG.mddocs/privacy.html(隐私政策)docs/technical.mddocs/design.md
审查清单
🔴 iOS 发布配置安全
严重
- [ ] Info.plist 包含
ITSAppUsesNonExemptEncryption(出口合规性声明) - [ ] Info.plist 包含所有必要的隐私权限声明:
NSPhotoLibraryUsageDescription— 如使用相册NSMicrophoneUsageDescription— 如使用麦克风NSLocationWhenInUseUsageDescription— 如使用定位NSCameraUsageDescription— 如使用相机- [ ] Info.plist 包含
CFBundleURLTypes(如使用深度链接/Supabase Auth 回调) - [ ] Supabase URL 和 Anon Key 不硬编码在 Dart 源码中
- [ ]
.env文件不在版本控制中(.gitignore包含.env) - [ ]
ios/Runner.xcworkspace/xcuserdata/**不在版本控制中(.gitignore包含*.xcuserstate和*.xcuserdatad)
警告
- [ ] Podfile 设置
platform :ios为 13.0 或更高 - [ ]
ios/Flutter/Generated.xcconfig确认在.gitignore中(避免硬编码路径泄漏) - [ ]
ios/Runner/Release.entitlements存在且配置正确(如需要推送通知、沙盒化等) - [ ] Release.xcconfig 或编译配置中
DART_OBFUSCATION=true - [ ] Release.xcconfig 中
TRACK_WIDGET_CREATION=false
🔴 Flutter 代码架构与质量
安全
- [ ] Supabase 凭证不硬编码(使用环境变量、flutter_dotenv 或 dart-define)
- [ ] 所有 API 响应进行防御性类型检查(
if (response.data is! Map)) - [ ] 用户输入在发送前经过长度限制和内容清理
- [ ]
!强制解包不存在于可能导致崩溃的路径
架构
- [ ] 数据写入操作统一通过 Repository 或 Provider,不在 Screen 中直接调用 Supabase 客户端
- [ ] Riverpod Provider 使用正确模式:
- 不在
build()方法中执行异步操作 - 使用
AsyncNotifier处理异步初始化 supabaseClientProvider语义正确- [ ]
StreamSubscription和控制器正确 dispose - [ ]
Future.delayed在页面 dispose 后不会触发回调访问已销毁的状态
错误处理
- [ ] 所有 API 调用和数据库操作有 try-catch
- [ ] 错误信息有用户友好的展示(SnackBar/Dialog),不静默吞掉
- [ ] 认证失败/网络错误有明确的状态处理
代码质量
- [ ] 无重复的 switch-case 逻辑(提取为工具函数)
- [ ] 无未使用的 import
- [ ] 无未使用的依赖包
- [ ]
prefer_const_constructorslint 警告已消除 - [ ]
InputDecoration统一使用Theme.of(context).inputDecorationTheme - [ ] 硬编码字符串提取到常量(AppStrings 或类似)
可访问性
- [ ] 按钮使用
IconButton/InkWell而非纯GestureDetector(支持键盘 Tab 导航) - [ ] 重要交互元素有
Semantics标签
🔴 Supabase 后端安全
凭证与访问
- [ ] Supabase Anon Key 设计上可暴露在客户端(由 RLS 控制权限)
- [ ]
.env文件(或环境变量)存储 Supabase URL 和 Anon Key - [ ] 服务端密钥(service_role key)绝不暴露在客户端代码中
RLS 策略验证(通过 MCP 工具查询 pg_policies 表)
- [ ]
profiles表:SELECT/INSERT/UPDATE 仅限本人(auth.uid() = id) - [ ]
debates表:所有操作仅限辩论创建者(auth.uid() = user_id) - [ ]
messages表:通过 debates 间接授权(嵌套 RLS 检查) - [ ]
achievements表:所有操作仅限本人
Edge Function 输入验证(每个 Edge Function 必须包含)
- [ ] 所有
req.json()解析后的字段进行类型检查(typeof验证) - [ ] 非空字符串验证(空字符串和 null 都需拒绝)
- [ ] 长度上限验证(如消息内容不超过 2000 字符)
- [ ] 内容清理(移除控制字符、trim 空白)
- [ ] SQL 注入防护(如有 SQL 操作)
- [ ] 速率限制(基于 IP 或用户 ID 的简单时间窗口限制)
API 响应
- [ ] 排行榜等接口不暴露
id等主键,只返回展示用字段 - [ ] 错误响应不泄露内部实现细节(如数据库表名、列名)
- [ ] 响应包含适当的 HTTP 状态码(400/401/403/404/500)
🟡 依赖管理与可维护性
版本检查
- [ ] Flutter SDK 版本为最新稳定版(运行
flutter --version确认) - [ ] 所有直接依赖无落后超过 2 个主版本的情况
- [ ]
flutter pub upgrade --major-versions无 breaking change 警告 - [ ] 无 discontinued 包(如
js已废弃)
依赖清理
- [ ] 无未使用的 direct 依赖(搜索 import 语句确认)
- [ ]
cached_network_image、shared_preferences等常见未使用包已确认用途 - [ ]
analysis_options.yaml配置合理的 lint 规则
构建配置
- [ ]
eas.json的appleTeamId和ascAppId替换为真实值(非占位符) - [ ] Android
AndroidManifest.xml的android:label使用字符串资源而非硬编码 - [ ]
pubspec.yaml的version符合语义化版本(SemVer)
🟡 文档与合规
必要文件
- [ ]
LICENSE文件存在(推荐 MIT 或 Apache 2.0) - [ ]
README.md已重写(非 Flutter 默认模板),包含:应用简介、功能特性、技术栈、快速开始 - [ ]
CHANGELOG.md存在,使用 Keep a Changelog 格式
隐私政策(docs/privacy.html)
- [ ] 联系方式为真实邮箱(非
example.com等占位域名) - [ ] 包含数据收集范围的完整说明
- [ ] 包含第三方 SDK(如 MiniMax API)的隐私政策链接
- [ ] 包含数据保留期(如"账号注销后30天删除")
- [ ] 包含用户数据导出权利(PIPL/GDPR 合规)
- [ ] 包含数据存储地点说明
- [ ] 包含未成年人隐私条款(《个人信息保护法》合规)
- [ ] 版本号与 App 版本对应
App Store 发布
- [ ] 有 App Store 上架检查清单文档(应用描述、关键词、截图计划、年龄分级)
- [ ] 有隐私标签映射文档(将隐私政策映射到 App Store Connect 隐私标签)
- [ ] 年龄分级正确(根据内容,辩论类通常 4+ 或 9+)
- [ ] 如有国内上架需求:软著、ICP 备案、APP 备案状态明确
用户协议
- [ ] 有用户协议/服务条款文档(如
docs/terms.html)
输出格式
1. 总览表格
| 维度 | 严重 | 警告 | 建议 | |------|------|------|------| | iOS 发布配置 | X | X | X | | Flutter 代码架构 | X | X | X | | Supabase 后端安全 | X | X | X | | 依赖管理 | X | X | X | | 文档与合规 | X | X | X | | 合计 | X | X | X |
2. 严重问题列表(按优先级排序)
每项包含:
- 问题描述
- 位置(文件:行号)
- 风险(安全/合规/稳定性)
- 修复建议(具体代码或操作步骤)
3. 警告问题列表
同上,分维度列出。
4. 建议问题列表
简略列出优化项。
5. 上线前行动路线图
P0(立即修复,否则无法上架):
- [ ] ...
- [ ] ...
P1(上线前必须修):
- [ ] ...
- [ ] ...
P2(提升质量):
- [ ] ...
- [ ] ...
6. 已确认无问题的方面
列出审查通过、无需修改的部分,增强信心。
修复执行
审查完成后,用户说"帮我修复"时,按以下优先级分批执行:
P0 修复批次(可并行):
- 移除硬编码凭证 → 环境变量
- Info.plist 补全隐私声明
.env加入.gitignore- 创建 LICENSE
- Android 应用名称本地化
- eas.json 替换占位符
P1 修复批次(可并行):
- 统一数据写入逻辑(走 Repository)
- Edge Function 输入验证
- API 响应防御性类型检查
- Podfile iOS 版本
- 清理 .xcuserstate 文件
- 补充隐私政策条款
- 排行榜数据脱敏
P2 修复批次(可并行):
- 重写 README.md
- 删除未使用依赖
- 创建 CHANGELOG.md
- 提取重复代码为工具类
- 优化 analysis_options.yaml
- 升级包版本(如 flutter_lints)
注意事项
- 审查时读取文件务必完整,不要断章取义
- RLS 策略验证必须通过 MCP 工具实际查询数据库,不可仅靠代码推断
- 对于 Flutter SDK 版本落后问题,需提醒用户
flutter upgrade的 breaking change 风险 - 隐私政策中涉及法律合规的内容,建议用户咨询法律专业人士
- 所有修复必须先读取原文件再编辑,不可覆盖无关内容
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: 111pointer111
- Source: 111pointer111/claude-marketplace
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.