
- Removed YuMi/Library/ (138 MB, not tracked) - Removed YuMi/Resources/ (23 MB, not tracked) - Removed old version assets (566 files, not tracked) - Excluded Pods/, xcuserdata/ and other build artifacts - Clean repository optimized for company server deployment
320 lines
9.6 KiB
Markdown
320 lines
9.6 KiB
Markdown
# 白牌项目一个月改造计划
|
||
|
||
## 项目背景
|
||
- **目标**:基于现有 YuMi 项目创建白牌版本,规避 App Store 审查
|
||
- **时间**:1个月
|
||
- **约束**:保留大部分基建代码和 SDK,功能可适当裁剪
|
||
- **核心策略**:三层剥离法(标识层 100% + 视觉层 80% + 代码结构层 30%)
|
||
|
||
---
|
||
|
||
## Week 1: 标识层改造(100%)- 不可逆的关键改动
|
||
|
||
### Day 1-2: 项目基础标识
|
||
- [ ] 创建新的 Xcode Project(新 Bundle ID、新证书)
|
||
- [ ] 全局替换类名前缀(5个前缀)
|
||
- `YM` → `新前缀1`(如 `LK`)
|
||
- `XP` → `新前缀2`(如 `SL`)
|
||
- `PI` → `新前缀3`(如 `MT`)
|
||
- `Moli` → `新前缀4`(如 `Nova`)
|
||
- `MS` → `新前缀5`(如 `AS`)
|
||
- [ ] 替换所有宏定义前缀
|
||
- `YUMI` → `新宏前缀`
|
||
- [ ] 修改全局常量文件
|
||
- `YUMIConstant.h/m` → 重命名 + 内容修改
|
||
- `YUMIHtmlUrl.h/m` → 重命名 + 内容修改
|
||
|
||
### Day 3: 文件和模块重命名
|
||
- [ ] 重命名核心模块文件夹
|
||
- `YMLogin` → `新名字`
|
||
- `YMMessage` → `新名字`
|
||
- `YMMine` → `新名字`
|
||
- `YMMonents` → `新名字`
|
||
- `YMNewHome` → `新名字`
|
||
- `YMRoom` → `新名字`
|
||
- `YMTabbar` → `新名字`
|
||
- [ ] 重命名 Pod 项目名
|
||
- `YuMi.podspec` → 新名字
|
||
- [ ] 修改 Podfile 引用
|
||
|
||
### Day 4-5: 字符串常量清理
|
||
- [ ] 扫描所有硬编码字符串(grep "YuMi|Moli|YUMI")
|
||
- [ ] 替换 UserDefaults/Keychain 的 key 前缀
|
||
- [ ] 替换所有中文文案为新的品牌名(可选保留,用新马甲名)
|
||
- [ ] 修改多语言文件(.strings)
|
||
|
||
---
|
||
|
||
## Week 2: 视觉层改造(80%)- UI/UX 大改
|
||
|
||
### Day 6-7: 资源文件全量替换
|
||
- [ ] **图片资源批量处理**(2971个文件)
|
||
- 编写脚本批量重命名所有图片
|
||
- 更换核心 icon(登录、TabBar、导航栏按钮等)
|
||
- 调整配色方案(主题色、渐变色)
|
||
- 工具:使用 Python/Shell 脚本 + ImageMagick
|
||
- [ ] **SVGA 动画资源**
|
||
- 重命名所有 .svga 文件
|
||
- 替换关键动画(登录动画、礼物动画)
|
||
- [ ] **App Icon 和启动图**
|
||
- 全新设计 AppIcon
|
||
- 替换 LaunchScreen
|
||
|
||
### Day 8-9: UI 组件库改造
|
||
- [ ] 颜色系统重构
|
||
- 修改 `DJDKMIMOMColor.h/m` 为新的色值
|
||
- 建立新的 UIColor 扩展类(不要用原类名)
|
||
- [ ] 通用 UI 组件重写
|
||
- `MoliAvatar` → 新的头像组件(改渲染逻辑)
|
||
- `SexAgeLabel` → 新样式
|
||
- `MoliMoneyLabel` → 新样式
|
||
- 所有渐变效果改变方向或色值
|
||
- [ ] 字体系统(可选)
|
||
- 替换默认字体为另一种商业字体
|
||
|
||
### Day 10-12: TabBar 和导航栏重构
|
||
- [ ] **TabBar 结构调整**
|
||
- 更改 Tab 数量(5个→4个?或6个?)
|
||
- 更改 Tab 顺序(如:首页/消息/我的 → 消息/首页/我的)
|
||
- 完全重写 `XPTabBar.h/m` 布局逻辑
|
||
- 新的选中/未选中动画效果
|
||
- [ ] **导航栏样式**
|
||
- `BaseViewController` 的导航栏改为新样式
|
||
- 所有返回按钮、右侧按钮图标更换
|
||
- 导航栏背景色/透明度调整
|
||
|
||
---
|
||
|
||
## Week 3: 代码结构层改造(30%)- 关键差异化
|
||
|
||
### Day 13-15: 核心页面 UI 重构
|
||
- [ ] **登录页面**(`YMLogin` 模块)
|
||
- 完全重写 UI 布局(从竖向改横向?)
|
||
- 登录方式顺序调整
|
||
- 新的视觉风格
|
||
- [ ] **首页**(`YMNewHome` 模块)
|
||
- 房间列表布局改变(瀑布流→网格?)
|
||
- 筛选器位置和样式调整
|
||
- Banner 尺寸和位置变化
|
||
- [ ] **房间页**(`YMRoom` 模块)
|
||
- ⚠️ 这是最大的模块(1059个文件)
|
||
- **策略**:只改 UI 层,不动业务逻辑
|
||
- 拆分 `XPRoomViewController.m`(4605行)
|
||
- 提取礼物模块为独立 ViewController
|
||
- 提取 PK 模块为独立 ViewController
|
||
- 提取底部控制栏为独立 View
|
||
|
||
### Day 16-17: 消息和动态模块
|
||
- [ ] **消息列表**(`YMMessage` 模块)
|
||
- Cell 样式完全重写
|
||
- 时间显示格式改变
|
||
- 头像位置调整
|
||
- [ ] **动态/朋友圈**(`YMMonents` 模块)
|
||
- 布局方式改变(卡片式→列表式?)
|
||
- 交互手势调整(点赞动画、评论入口)
|
||
|
||
### Day 18-19: 个人中心模块
|
||
- [ ] **我的页面**(`YMMine` 模块)
|
||
- 顶部个人信息卡片重新设计
|
||
- 设置项图标和顺序调整
|
||
- 等级/财富展示方式改变
|
||
|
||
---
|
||
|
||
## Week 4: 功能裁剪和测试
|
||
|
||
### Day 20-21: 功能裁剪(可选)
|
||
根据实际情况,可以移除以下模块以降低相似度:
|
||
- [ ] 移除小游戏模块(如果有独特的游戏)
|
||
- [ ] 移除特定的礼物动画
|
||
- [ ] 简化某些复杂的 H5 页面
|
||
- [ ] 移除品牌相关的活动页面
|
||
|
||
### Day 22-23: 网络层包装
|
||
- [ ] 在 `HttpRequestHelper` 外包一层新 API
|
||
- [ ] 更改请求头字段名(User-Agent, Custom-Headers)
|
||
- [ ] 参数加密方式微调(如果可以服务端配合)
|
||
|
||
### Day 24-28: 全面测试
|
||
- [ ] 核心功能冒烟测试
|
||
- 登录/注册
|
||
- 首页浏览
|
||
- 进入房间
|
||
- 发送消息
|
||
- 充值流程(测试环境)
|
||
- [ ] UI 自动化测试(截图对比)
|
||
- [ ] 崩溃率监控(集成 Bugly/Firebase)
|
||
- [ ] 内存泄漏检测
|
||
|
||
### Day 29-30: 提审准备
|
||
- [ ] 准备新的 App Store 截图(5-10张)
|
||
- [ ] 撰写新的应用描述(完全不同的文案)
|
||
- [ ] 准备审核说明(强调差异化功能)
|
||
- [ ] 最终检查清单
|
||
|
||
---
|
||
|
||
## 关键技术方案
|
||
|
||
### 1. 批量类名替换脚本
|
||
```bash
|
||
#!/bin/bash
|
||
# rename_classes.sh
|
||
|
||
OLD_PREFIX="YM"
|
||
NEW_PREFIX="LK"
|
||
|
||
# 查找所有 .h 和 .m 文件
|
||
find ./YuMi -type f \( -name "*.h" -o -name "*.m" \) -exec sed -i '' "s/${OLD_PREFIX}/${NEW_PREFIX}/g" {} +
|
||
|
||
# 重命名文件
|
||
find ./YuMi -type f -name "${OLD_PREFIX}*" | while read file; do
|
||
newname=$(echo "$file" | sed "s/${OLD_PREFIX}/${NEW_PREFIX}/g")
|
||
mv "$file" "$newname"
|
||
done
|
||
```
|
||
|
||
### 2. 图片资源批量处理
|
||
```python
|
||
#!/usr/bin/env python3
|
||
# rename_images.py
|
||
|
||
import os
|
||
import hashlib
|
||
from PIL import Image
|
||
|
||
def rename_images(root_dir):
|
||
for dirpath, dirnames, filenames in os.walk(root_dir):
|
||
for filename in filenames:
|
||
if filename.endswith(('.png', '.jpg', '.jpeg')):
|
||
old_path = os.path.join(dirpath, filename)
|
||
# 生成新的随机名称(基于内容hash)
|
||
new_name = hashlib.md5(open(old_path,'rb').read()).hexdigest()[:16]
|
||
new_path = os.path.join(dirpath, new_name + os.path.splitext(filename)[1])
|
||
os.rename(old_path, new_path)
|
||
print(f"Renamed: {filename} -> {new_name}")
|
||
|
||
if __name__ == "__main__":
|
||
rename_images("./YuMi/Assets.xcassets")
|
||
```
|
||
|
||
### 3. 拆分超大类工具(XPRoomViewController)
|
||
使用 Category 方式拆分,不改变主类:
|
||
```objc
|
||
// XPRoomViewController+Gift.h
|
||
@interface XPRoomViewController (Gift)
|
||
- (void)setupGiftUI;
|
||
- (void)handleGiftAction;
|
||
@end
|
||
|
||
// XPRoomViewController+PK.h
|
||
@interface XPRoomViewController (PK)
|
||
- (void)setupPKUI;
|
||
- (void)handlePKAction;
|
||
@end
|
||
```
|
||
|
||
### 4. 颜色系统替换
|
||
```objc
|
||
// 新建 AppTheme.h
|
||
@interface AppTheme : NSObject
|
||
+ (UIColor *)primaryColor; // 主色调
|
||
+ (UIColor *)secondaryColor; // 辅助色
|
||
+ (UIColor *)accentColor; // 强调色
|
||
@end
|
||
|
||
// 全局替换所有硬编码颜色
|
||
// 旧: [UIColor colorWithHex:0xFF6B9D]
|
||
// 新: [AppTheme primaryColor]
|
||
```
|
||
|
||
---
|
||
|
||
## 风险控制
|
||
|
||
### 高风险点
|
||
1. **类名替换可能误伤字符串**
|
||
- 解决:先 grep 找出所有字符串常量,手动检查
|
||
- 工具:`grep -r "\".*YM.*\"" ./YuMi`
|
||
|
||
2. **图片批量重命名导致找不到资源**
|
||
- 解决:先做映射表,然后用脚本全局替换代码中的引用
|
||
- 保留原图副本,出错可回滚
|
||
|
||
3. **第三方 SDK 回调失败**
|
||
- 原因:某些 SDK 使用类名字符串反射
|
||
- 解决:保留涉及 SDK 的类名不变,或在映射表中特殊处理
|
||
|
||
4. **TabBar 结构改变导致通知/跳转失败**
|
||
- 原因:很多业务逻辑硬编码了 Tab index
|
||
- 解决:全局搜索 `selectedIndex` 和 TabBar 相关跳转
|
||
|
||
### 测试检查清单
|
||
- [ ] 所有第三方登录(Facebook/Google/Apple)
|
||
- [ ] 支付流程(内购/第三方支付)
|
||
- [ ] IM 消息收发
|
||
- [ ] 直播推流和拉流
|
||
- [ ] 深度链接(Deep Link)
|
||
- [ ] 推送通知
|
||
- [ ] 分享功能
|
||
|
||
---
|
||
|
||
## 成功标准
|
||
|
||
### App Store 审查通过标准
|
||
1. ✅ 二进制代码相似度 < 30%(类名、方法名完全不同)
|
||
2. ✅ 所有截图视觉差异明显(配色、布局、icon)
|
||
3. ✅ Bundle ID 和签名完全不同
|
||
4. ✅ 应用描述和关键词无重叠
|
||
5. ✅ 核心功能可正常使用
|
||
|
||
### 技术债务评估
|
||
- 预计技术债务:中等
|
||
- 后续维护:需要同步维护两套代码(建议用 Git 分支管理)
|
||
- 代码质量:不会比原项目更差(因为会顺便重构)
|
||
|
||
---
|
||
|
||
## 备选方案
|
||
|
||
如果 30 天时间不够,可以采用 **最小可行方案**(MVP):
|
||
|
||
### 最小改造清单(15天)
|
||
1. 类名全局替换(2天)
|
||
2. 核心图片替换(50个关键icon)(2天)
|
||
3. 主题色全局替换(1天)
|
||
4. TabBar 重新设计(2天)
|
||
5. 登录页重写(2天)
|
||
6. 首页重写(3天)
|
||
7. 测试和提审(3天)
|
||
|
||
这个方案可以达到约 50-60% 的差异化,适合时间极度紧张的情况。
|
||
|
||
---
|
||
|
||
## 附录:工具清单
|
||
|
||
### 开发工具
|
||
- Xcode Refactor 功能(批量重命名)
|
||
- AppCode(IntelliJ 的 OC IDE,重构能力更强)
|
||
- Shell 脚本(批量文件操作)
|
||
- Python 脚本(图片处理、文本替换)
|
||
|
||
### 设计工具
|
||
- Sketch/Figma(重新设计 UI)
|
||
- ImageMagick(批量图片处理)
|
||
- Lottie/SVGA Player(动画资源处理)
|
||
|
||
### 测试工具
|
||
- Charles/Proxyman(抓包测试网络)
|
||
- Instruments(性能和内存测试)
|
||
- Xcode UI Testing(自动化测试)
|
||
|
||
---
|
||
|
||
**制定人**: Linus Mode AI
|
||
**创建时间**: 2025-10-09
|
||
**预计完成时间**: 2025-11-09(30天)
|
||
|