美文网首页iOS实用功能
iOS马甲包之修改项目名和批量修改类名

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

作者: 马威明 | 来源:发表于2021-04-02 15:14 被阅读0次

    马甲包产生背景:

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

    相关文章

      网友评论

        本文标题:iOS马甲包之修改项目名和批量修改类名

        本文链接:https://www.haomeiwen.com/subject/rxbfkltx.html