
- 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
9.6 KiB
9.6 KiB
白牌项目一个月改造计划
项目背景
- 目标:基于现有 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. 批量类名替换脚本
#!/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. 图片资源批量处理
#!/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 方式拆分,不改变主类:
// XPRoomViewController+Gift.h
@interface XPRoomViewController (Gift)
- (void)setupGiftUI;
- (void)handleGiftAction;
@end
// XPRoomViewController+PK.h
@interface XPRoomViewController (PK)
- (void)setupPKUI;
- (void)handlePKAction;
@end
4. 颜色系统替换
// 新建 AppTheme.h
@interface AppTheme : NSObject
+ (UIColor *)primaryColor; // 主色调
+ (UIColor *)secondaryColor; // 辅助色
+ (UIColor *)accentColor; // 强调色
@end
// 全局替换所有硬编码颜色
// 旧: [UIColor colorWithHex:0xFF6B9D]
// 新: [AppTheme primaryColor]
风险控制
高风险点
-
类名替换可能误伤字符串
- 解决:先 grep 找出所有字符串常量,手动检查
- 工具:
grep -r "\".*YM.*\"" ./YuMi
-
图片批量重命名导致找不到资源
- 解决:先做映射表,然后用脚本全局替换代码中的引用
- 保留原图副本,出错可回滚
-
第三方 SDK 回调失败
- 原因:某些 SDK 使用类名字符串反射
- 解决:保留涉及 SDK 的类名不变,或在映射表中特殊处理
-
TabBar 结构改变导致通知/跳转失败
- 原因:很多业务逻辑硬编码了 Tab index
- 解决:全局搜索
selectedIndex
和 TabBar 相关跳转
测试检查清单
- 所有第三方登录(Facebook/Google/Apple)
- 支付流程(内购/第三方支付)
- IM 消息收发
- 直播推流和拉流
- 深度链接(Deep Link)
- 推送通知
- 分享功能
成功标准
App Store 审查通过标准
- ✅ 二进制代码相似度 < 30%(类名、方法名完全不同)
- ✅ 所有截图视觉差异明显(配色、布局、icon)
- ✅ Bundle ID 和签名完全不同
- ✅ 应用描述和关键词无重叠
- ✅ 核心功能可正常使用
技术债务评估
- 预计技术债务:中等
- 后续维护:需要同步维护两套代码(建议用 Git 分支管理)
- 代码质量:不会比原项目更差(因为会顺便重构)
备选方案
如果 30 天时间不够,可以采用 最小可行方案(MVP):
最小改造清单(15天)
- 类名全局替换(2天)
- 核心图片替换(50个关键icon)(2天)
- 主题色全局替换(1天)
- TabBar 重新设计(2天)
- 登录页重写(2天)
- 首页重写(3天)
- 测试和提审(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天)