ppp-ios — PaperPhone+ 的 iOS 原生客户端分支,基于 Capacitor 将 React Web 应用打包为 iOS 原生 App。
React TypeScript Capacitor Vite License: AGPL v3
🌐 English Version: README_EN.md
本仓库是 PaperPhone+ 的 iOS 原生客户端分支。PaperPhone+ 是一款仿微信 UI 的端对端加密即时通讯软件,采用无状态 ECDH + XSalsa20-Poly1305 逐消息加密,具备前向保密特性。
本项目使用 Capacitor 将 React + TypeScript 前端封装为 iOS 原生应用,支持 APNS 推送通知,并已上架 App Store。
| 功能 | 说明 |
|---|---|
| 🔐 端对端加密 | 无状态 ECDH + XSalsa20-Poly1305,逐消息临时密钥,前向保密 |
| 🛡️ 抗量子加密 | 集成 CRYSTALS-Kyber 后量子密钥封装 |
| 🗝️ 零知识服务器 | 私钥仅在设备本地,四层持久化(内存 → localStorage → sessionStorage → IndexedDB) |
| 📹 视频/语音通话 | WebRTC P2P (1:1) + Mesh (多人),Cloudflare TURN 穿透 |
| 🎙️ 实时变声 | 3 档可选 (0.8x / 1.0x / 1.2x),基于 Web Audio API |
| 👥 群聊 | 最多 2000 人,支持加密/未加密两种模式 |
| 💬 消息 | 文字、图片、视频、文档、语音消息、Emoji 面板、Telegram 贴纸包 |
| 🌐 朋友圈 | 发动态、点赞、评论、标签可见性控制 |
| 📰 时间线 | 小红书风格双列瀑布流,支持匿名发帖 |
| 🔔 APNS 推送 | Apple Push Notification Service 原生推送 |
| 🌍 多语言 | 中/英/日/韩/法/德/俄/西,8 种语言 |
| 🔑 两步验证 | TOTP (Google Authenticator 兼容) + 恢复码 |
前端
React 19 + TypeScript 5.7 + Vite 6
Zustand — 状态管理
libsodium-wrappers-sumo — Curve25519 / XSalsa20-Poly1305 (WebAssembly)
crystals-kyber-js — 后量子密钥封装
WebRTC API — 视频/语音通话
Web Audio API — 实时变声
原生层 (Capacitor 8)
@capacitor/ios — iOS 原生桥接
@capacitor/push-notifications — APNS 推送
@capacitor/local-notifications — 本地通知
@capacitor/splash-screen — 启动屏
@capacitor/status-bar — 状态栏控制
@capacitor/app — App 生命周期
ppp-ios/
├── index.html # HTML 入口
├── capacitor.config.ts # Capacitor 配置(appId、HTTPS scheme 等)
├── vite.config.ts # Vite 构建配置
├── package.json # 依赖管理
├── tsconfig.json # TypeScript 配置
├── ios/ # Xcode 原生工程目录
├── src/
│ ├── main.tsx # React 入口
│ ├── App.tsx # 路由 + 鉴权守卫
│ ├── index.css # 设计系统(暗色/亮色,玻璃拟态)
│ ├── api/ # HTTP + WebSocket 客户端
│ ├── crypto/
│ │ ├── ratchet.ts # ECDH + XSalsa20-Poly1305 加密
│ │ ├── keystore.ts # 四层私钥持久化
│ │ └── groupCrypto.ts # 群聊加密 (Sender Key)
│ ├── hooks/ # React Hooks
│ ├── i18n/ # 多语言 (8 种语言)
│ ├── store/ # Zustand 状态管理
│ ├── components/ # 共享组件
│ ├── contexts/ # React Context
│ ├── utils/ # 工具函数
│ └── pages/
│ ├── Login.tsx # 登录/注册
│ ├── Chats.tsx # 会话列表
│ ├── Chat.tsx # 聊天窗口
│ ├── Contacts.tsx # 通讯录
│ ├── Discover.tsx # 发现页
│ ├── Profile.tsx # 设置
│ ├── UserProfile.tsx # 联系人资料
│ ├── GroupInfo.tsx # 群信息
│ ├── Moments.tsx # 朋友圈
│ └── Timeline.tsx # 时间线
├── public/ # 静态资源
├── assets/ # 应用资源
├── dist/ # 构建输出
└── build/ # 构建产物
- Node.js ≥ 18
- npm ≥ 9
- Xcode ≥ 15(含 iOS 17+ SDK)
- CocoaPods(用于 iOS 原生依赖)
- macOS(iOS 开发必需)
git clone <repo-url> && cd ppp-ios
npm install
npm run dev
# 打开 http://localhost:5173# 构建前端 npm run build # 同步到 Capacitor iOS 项目 npx cap sync ios # 打开 Xcode npx cap open ios
- 在 Xcode 中选择目标设备或模拟器
- 配置签名(Signing & Capabilities)
- 点击 Run (⌘R)
本项目使用 APNS (Apple Push Notification Service) 进行原生推送通知。
- 有效的 Apple Developer 账号
- 在 Apple Developer Portal 创建 APNS Key (.p8 文件)
- 在 Xcode 中启用 Push Notifications capability
在后端 server/.env 中配置:
APNS_TEAM_ID=你的Team_ID APNS_KEY_ID=你的Key_ID APNS_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----" APNS_BUNDLE_ID=com.fm619tech.paperphoneplus APNS_SANDBOX=false # TestFlight 用 true,App Store 用 false
或使用官方推送中继(无需 Apple 凭据):
APNS_RELAY_URL=https://619.chat APNS_RELAY_KEY=EzmpqftbsENaRUO6BTABxLV96q7RuEDyokXJr1DWdDjL54cLg7yXVUQqydCQvxrX
本项目是 619dev/PaperPhonePlus 的 iOS 客户端分支。上游项目包含完整的后端(Rust/Axum)和前端源码。
如需部署完整系统(含后端服务器),请参阅上游项目文档:
- 🚀 Zeabur 一键云部署
- 🐳 Docker Compose 一键部署
- ▲さんかく Vercel 前端部署
- 📡 视频通话 TURN 配置
- 🔔 推送通知(APNS / FCM / OneSignal / ntfy / Web Push)
本项目基于 GNU Affero General Public License v3.0 (AGPL-3.0) 开源,与上游项目 619dev/PaperPhonePlus 保持一致。
简而言之:
- ✅ 个人和企业均可自由部署和使用
- ✅ 允许修改代码
⚠️ 修改后通过网络提供服务时,必须公开修改后的源代码⚠️ 衍生作品必须使用相同协议(AGPL-3.0)
完整协议文本请参阅 LICENSE 文件。
- PaperPhone+ — 上游项目
- Capacitor — 跨平台原生运行时
- libsodium — 加密库
- CRYSTALS-Kyber — 后量子密码学