iOS马甲包之修改项目名和批量修改类名
马甲包产生背景:
1、解决被拒问题:
由于苹果市场单一 审核严格 很有可能导致各种各样的上线被拒问题 而多次被拒以后 就会大大降低审核通过率 严重者可能会给公司造成很大的损失 而一个好的马甲包 就可以比较好的解决此类问题。
2、规避市场和政策风险:
APP上线以后 为了更好的推广 可能会有刷榜 刷热搜的需求 而往往排名比较靠前的APP 会得到苹果公司的重视与二次审查 一旦发现某些违规操作 很可能面临主包被下架 甚至账号被封的风险 马甲包在遇到此类问题可以暂时作为主包的替代品 降低公司损失。
3、增加搜索关键词 为主包导量
苹果账号每个APP可以填写100个以内的搜索关键字 而显然 搜索关键字越多 在Apple Store展现给用户的概率越大 马甲包上线可以填写与主包不同的关键字 以增加搜索关键字覆盖率 同时马甲包可以在APP内通过弹窗等形式将用户引流给主包。
制作马甲包的方法和步骤有很多种,比如局部上线、UI色调更改、代码混淆、更换上线账号、重启路由器、更换电脑打包、更改资源文件名称以及hash值等,制作马甲包的时候可以根据APP当下上线的难度和自己具体的需求综合考量。
通常情况下 代码层面上 马甲包的前两个步骤就是修改项目名和类名。
修改项目名
本次项目名从MacoTest修改为BMWTest 步骤如下:
1、打开项目 对项目名重命名
选中工程目录 按下回车键进入编辑状态![](https://img.haomeiwen.com/i8532098/87a8d36eb1e73ad1.png)
输入新的项目名会弹出下面的确认框
![](https://img.haomeiwen.com/i8532098/e56718bf4c9616a0.png)
直接按下回车键 然后在接下来的提示框中点击continue即可完成工程目录的修改
2、修改项目根目录及根目录下文件夹的名称
将下图中所有的名为MacoTest的文件名改成BMWTest即可![](https://img.haomeiwen.com/i8532098/b33e7d58e5f423ea.png)
3、修改项目包内容
选中工程BMWTest.xcodeproj目录右键选中显示包内容![](https://img.haomeiwen.com/i8532098/868119dd9a200ef2.png)
双击打开project.pbxproj文件
![](https://img.haomeiwen.com/i8532098/3a3e63eaf601617a.png)
搜索旧项目名MacoTest字段全部替换为BMWTest字段
![](https://img.haomeiwen.com/i8532098/7347cb9cd057496c.png)
4、打开项目
如果项目没有使用Cocoapods 直接双击打开BMWTest.xcodeproj文件即可运行
![](https://img.haomeiwen.com/i8532098/de1819e7e6c00a26.png)
此时我直接运行项目 报了大概如下三个错误
![](https://img.haomeiwen.com/i8532098/14d6b4ded3637863.png)
大概意思是 相关目录下没找到对应的文件
![](https://img.haomeiwen.com/i8532098/89c5d13d57bebbb4.png)
5、修改 Scheme
此时虽然可以跑起来 但发现Scheme还是旧的![](https://img.haomeiwen.com/i8532098/33c348c8954021d1.png)
选中MacoTest在下拉框中选择Manage Schemes...
![](https://img.haomeiwen.com/i8532098/c8d505cbe3c16165.png)
然后把旧名称改成新名称 点击close即可
![](https://img.haomeiwen.com/i8532098/53bd1c9d6f78d6d3.png)
此时项目名修改已经算是完成了 不过全局搜索一下旧项目名MacoTest 发现每个类最上面 会有一些旧的注释 全局替换掉就OK了。
此时项目名已修改完成。
批量修改类名
批量修改类名一般基于类名有公共前缀的情况。
1、配置python3 环境
参考链接
配置好以后 打开终端 输入python3 命令查看是否安装好
![](https://img.haomeiwen.com/i8532098/0b54e7399b58df35.png)
2、在项目根目录下创建一个.py可执行文件
cd到项目根目录
终端touch命令创建一个.py文件
比如 touch rename.py
然后把下面的代码复制到rename.py文件中 并根据实际情况修改相关配置(主要修改对应的类名前缀信息 需求改的文件后缀信息 项目根路径以及项目包内容路径等)
import os
# 需要修改的类名前缀
pre_str = 'Maco'
# 新的类名前缀
pre_to_str = 'BMW'
# 根据需求搜寻以下文件类型(如项目中使用xib storyboard等情况 可以自行添加)
suf_set = ('.h', '.m')
# 项目代码文件根路径
project_path = '/Users/wb2lz/Desktop/Test/BMWTest/BMWTest'
# 项目project.pbxproj文件路径 需要更新配置文件中的类名
pbxpro_path = '/Users/wb2lz/Desktop/Test/BMWTest/BMWTest.xcodeproj/project.pbxproj'
# 文件重命名函数,返回新的文件名
def file_rename(file_path):
root_path = os.path.split(file_path)[0] # 文件目录
root_name = os.path.split(file_path)[1] # 文件名包含扩展名
filename = os.path.splitext(root_name)[0]; # 文件名
filetype = os.path.splitext(root_name)[1]; # 文件扩展名
new_path = os.path.join(root_path, filename.replace(pre_str, pre_to_str) + filetype) # 拼接新路径
os.renames(file_path, new_path) # 文件重命名
return filename.replace(pre_str, pre_to_str)
# 定义一个字典 key=旧类名 value=新类名
needModifyDic = {}
# 遍历文件,符合规则的进行重命名
for (root, dirs, files) in os.walk(project_path):
for file_name in files:
if file_name.startswith((pre_str,)) and file_name.endswith(suf_set):
old_name = os.path.splitext(file_name)[0]
new_name = file_rename(os.path.join(root, file_name))
needModifyDic[old_name] = new_name
# 遍历文件,在文件中更换新类名的引用
print(needModifyDic)
for (root, dirs, files) in os.walk(project_path):
for file_name in files:
if file_name.endswith(suf_set):
print('-----fileName-------' + file_name)
with open(os.path.join(root, file_name), 'r+') as f:
print('========fileName========' + file_name)
s0 = f.read()
f.close()
for key in needModifyDic:
if key in s0:
with open(os.path.join(root, file_name), 'r+') as f4:
s1 = f4.read().replace(key, needModifyDic[key])
print(key + ' ------> ' + needModifyDic[key])
f4.seek(0)
f4.write(s1)
f4.truncate()
f4.close()
# 替换配置文件中的类名
for key in needModifyDic:
with open(pbxpro_path, 'r+') as f:
s0 = f.read()
f.close()
if key in s0:
with open(pbxpro_path, 'r+') as f2:
s = f2.read().replace(key, needModifyDic[key])
f2.seek(0)
f2.write(s)
f2.truncate()
f2.close()
然后终端执行 python3 rename.py 即可修改相关类名前缀。