iOS马甲包之修改项目名和批量修改类名

马甲包产生背景:

1、解决被拒问题:

由于苹果市场单一 审核严格 很有可能导致各种各样的上线被拒问题 而多次被拒以后 就会大大降低审核通过率 严重者可能会给公司造成很大的损失 而一个好的马甲包 就可以比较好的解决此类问题。

2、规避市场和政策风险:

APP上线以后 为了更好的推广 可能会有刷榜 刷热搜的需求 而往往排名比较靠前的APP 会得到苹果公司的重视与二次审查 一旦发现某些违规操作 很可能面临主包被下架 甚至账号被封的风险 马甲包在遇到此类问题可以暂时作为主包的替代品 降低公司损失。

3、增加搜索关键词 为主包导量

苹果账号每个APP可以填写100个以内的搜索关键字 而显然 搜索关键字越多 在Apple Store展现给用户的概率越大 马甲包上线可以填写与主包不同的关键字 以增加搜索关键字覆盖率 同时马甲包可以在APP内通过弹窗等形式将用户引流给主包。

制作马甲包的方法和步骤有很多种,比如局部上线、UI色调更改、代码混淆、更换上线账号、重启路由器、更换电脑打包、更改资源文件名称以及hash值等,制作马甲包的时候可以根据APP当下上线的难度和自己具体的需求综合考量。
通常情况下 代码层面上 马甲包的前两个步骤就是修改项目名和类名。

修改项目名

本次项目名从MacoTest修改为BMWTest 步骤如下:

1、打开项目 对项目名重命名

选中工程目录 按下回车键进入编辑状态
编辑项目名

输入新的项目名会弹出下面的确认框
项目名rename确认框

直接按下回车键 然后在接下来的提示框中点击continue即可完成工程目录的修改
2、修改项目根目录及根目录下文件夹的名称

将下图中所有的名为MacoTest的文件名改成BMWTest即可
需要修改的文件目录
3、修改项目包内容

选中工程BMWTest.xcodeproj目录右键选中显示包内容
显示包内容方式

双击打开project.pbxproj文件
包内容目录

搜索旧项目名MacoTest字段全部替换为BMWTest字段
替换包内容字段
4、打开项目

如果项目没有使用Cocoapods 直接双击打开BMWTest.xcodeproj文件即可运行

如果项目中使用了Cocoapods 双击打开BMWTest.xcworkspace文件 此时BMWTest应该是红色的 原因是路径链接的还是MacoTest的旧路径 此时点击右边侧边栏文件夹小图标 重新选一下路径即可正常显示(也可以把红色文件连同Pods文件一起删除掉 然后在左边侧边栏区域右键重新添加BMWTest.xcodeproj和Pods两个文件)
修改路径后

此时我直接运行项目 报了大概如下三个错误
项目运行报错

大概意思是 相关目录下没找到对应的文件

此时打开项目文件夹 找到 Podfile 文件 双击打开 此时发现文件中target还是旧的 修改一下 然后打开终端 cd到项目根目录 pod install一下 重新运行就可以成功了
Podfile
5、修改 Scheme

此时虽然可以跑起来 但发现Scheme还是旧的
旧Scheme

选中MacoTest在下拉框中选择Manage Schemes...
管理Scheme

然后把旧名称改成新名称 点击close即可
编辑Scheme

此时项目名修改已经算是完成了 不过全局搜索一下旧项目名MacoTest 发现每个类最上面 会有一些旧的注释 全局替换掉就OK了。
此时项目名已修改完成。

批量修改类名

批量修改类名一般基于类名有公共前缀的情况。

1、配置python3 环境

参考链接
配置好以后 打开终端 输入python3 命令查看是否安装好

python3环境查看

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 即可修改相关类名前缀。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354