前言
本工具用于应对苹果对重复应用的审核(Guideline 4.3 Design Spam),避免苹果机审检测概率。
被拒处理
4.3一般存在3种情况,可以根据被拒回复进行判断,如果你真的看不懂被拒回复,下面一一列举,逐一排除
第一种:简称代码重复,代码重复使用也有三种情况
1.可能你之前用这套源码上过一个包,现在用这套代码直接改一个logo跟名字再上一个马甲,这种基本会直接4.3
这种情况基本要改源码,第一步:工程中的文件夹的名字全部进行修改。第二步:每一个工程都有一个类前缀, 我们需要取一个长一点的类前缀, 并且这个类前缀在你的整个工程一定是一个唯一的字符串, 我们假设这个类前缀是PayDayLoan, 现在我们需要生成一个控制器, 控制器的结尾Controller也需要用一个特定的字符去代替, 比如:Director,剩下的View以及object做法类似, 就不一一介绍了,做马甲的时候就是把这些名字用另一个唯一的字符去代替, 尽量长一点。第三步:把另一个其他的工程中的类全部导入进来, 主要是混淆代码, 在现有的工程中调用, 可以没有任何效果, 只是单纯调用方法。
注:单一的加入垃圾代码混淆没用的!
2.如果你的这套源码在一个账号上提交过,但是被拒了,后来因为其他原因你不得不在别的账号上重新提交此源码,这种情况第二个账号基本也会报4.3
这种情况需要在第一个账号做一下处理, xcode新建一个应用, 直接用之前提交过的bundle Id打包,logo用一个纯白或者纯黑的图片, 将这个新建的应用提交到应用市场, 构建版本中将之前被拒的包移除, 用这个新的应用顶替之前被拒的包, app名字改成 “作废-此应用不再提交” 后面再随便加一个数次, 因为这个名字别人已经用过了, app描述跟app名字一样, 剩下的信息全部删除.最后点击保存即可.
3.你的源码只要提交到itunes connect里面,就算没提交审核,当你再次使用此源码提交审核的时候,基本都会报4.3
第二种界面功能相似这种情况简单的改源码已经没用了,需要在原有的app上加一些不同的功能,我用借贷类举例说明该如何解决,其他类型的app可以参考以下举两个应用说明, 分别用A应用与B应用代替, 你需要如何处理并且如何回复审核人员
1.A应用 是给没有信用卡的用户使用的一款借款App,B应用 是给有信用卡的用户使用的一款借款App.2.A应用的最高借款额度是1000元, B应用 的最高借款额度是25000元.3.A应用的还款时间是7天与14天, B应用 的还款时间是28天. 4.A应用内部有贷款计算器功能, B应用只是一个普通的贷款app, 并无其他功能5.两款app是我们公司内不同的部门开发的app, 分别针对不同的用户人群.
第三种,app名字被用过针对马甲包标题、名称、描述不合规的这项被拒原因,最有效的解决方案就是:马甲包名称方面:按照苹果审核回执书写标准修改马甲包的名称(侵犯其他品牌名称需要重新取名);升级version或者build ID 重新提审。马甲包标题方面:去除误导性品牌词、切换品牌词组合方式;修改标题长度(可进行标题精简字数至10字以内、多语言版本可每个语言版本标题一致),并回复苹果审核。马甲包产品描述方面:按照苹果审核回执去除误导性及错误性描述,尽量贴近游戏产品功能,并回复苹果审核。
除以上步骤外,还需要注意相同的马甲包提交至少要间隔一天以上,避免被同一个审核员看到。当然,还可以配合着升级套路:升级version(版本)号、换bundle id,换开发者账号再提交审核;如果以上步骤不奏效,还可以尝试采用修改应用价格、发布地区、产品分类等方式。不过注意,App上架后价格、发布地区是可以修改的,但产品分类不可以,对这个有要求的慎用!
IPv6的话,确认代码没问题的话,重新提交1~2次就好了。多数是审核人员所在的网络环境导致的问题,如果不放心,重新提交时将截图或拍下视频放附件里或直接向苹果申诉。如果 App本身有问题,例如不兼容 IPv6,最好的办法是让App兼容 IPv6 或通过升级服务器来支持IPv6,其他代码问题问问技术就OK了。
多尝试,不试试你永远不知道你什么时候会成功!
1、定期换电脑提包.
2、换电脑的序列号.
3、换图标,换启动图.
4、换VPN环境.
5、定期换域名.
工具方法
图片一
图片二
- 修改工程名
- 修改类名前缀
- 扫描工程中的代码,生成同等数量的 Category 文件,文件中及是同等方法数量的垃圾代码。
- 修改 xxx.xcassets 文件夹中的 png 资源文件名。
- 删除代码中的所有注释和空行。
使用
使用源码
- 下载源码。
- 用 Xcode 打开工程并配置参数。如图
- 运行
使用二进制文件,在终端中执行 GenerateSpamCode
$ ./GenerateSpamCode \
/Users/kelei/Documents/work/git/projectName/source \
-deleteComments
参数说明
-
(必填) 源码文件夹绝对路径(如:
/Users/kelei/Documents/work/git/projectName/source
) -
-modifyProjectName [原名称]>[新名称] 修改工程名。程序会修改
原名称-Swift.h
、Podfile
、原名称-Bridging-Header.h
、源码文件夹绝对路径
、原名称.xcodeproj
和原名称.xcworkspace
的名称和内容。Podfile
被修改后需要手动pod install
-
-modifyClassNamePrefix [工程文件 xcodeproj 绝对路径] [原前缀]>[新前缀] 修改源代码类名前缀。程序会扫描
源码文件夹绝对路径
下的 .h .swift 文件,修改文件名,修改使用该类名的代码,修改工程文件
中的文件名。文件名有原前缀
的会修改成新前缀
,如:原前缀ViewController
变成新前缀ViewController
;没有原前缀
的会增加新前缀
,如:ViewController
变成新前缀ViewController
。 -
-spamCodeOut [垃圾代码文件输出目录] [垃圾代码方法增加的参数名] 生成垃圾代码。程序会扫描
源码文件夹绝对路径
下的 .m .swift 文件中的类和方法,并生成category
和extension
文件,文件中的方法是在代码原方法的基础上增加垃圾代码方法增加的参数名
参数。如:-spamCodeOut /dir AppLog
,会将- (void)setupKeys {}
生成为+ (BOOL)setupKeysAppLog:(NSInteger)AppLog { return AppLog % 20 == 0; }
,会将- (void)foo:(NSString *)str {}
生成为+ (BOOL)fooAppLog:(NSInteger)AppLog { return AppLog % 23 == 0; }
-
-ignoreDirNames [忽略文件夹名称字符串] 忽略这些文件夹,对
-modifyClassNamePrefix
、-spamCodeOut
和-deleteComments
参数有效。目前只会忽略源码文件夹绝对路径
下一级的这些目录。如:/p/s -ignoreDirNames categorys
,那么/p/s/categorys
会被忽略,但/p/s/viewControllers/categorys
不会忽略。 -
-handleXcassets 修改
xxx.xcassets
文件夹中的 png 资源文件名,同时也Contents.json
文件中的关联名称,不会影响代码中使用图片。 - -deleteComments 删除工程目录下 .h .m .swift 文件中的注释和空行。
另外修改图片 hash 值的方法
使用 ImageMagick 对 png 图片做轻量压缩,及不损失图片质量,又可改变图片文件 hash 值。方法:
- 安装 ImageMagick,
brew install imagemagick
- 压缩工程目录下所有 png 文件,
find . -iname "*.png" -exec echo {} \; -exec convert {} {} \;
使用经验
就我 2017-11 月的提交情况来看,只需要做如下修改就可以上马甲包了。
- 修改工程名
- 修改类名前缀
- 修改图片文件 Hash 值
- 修改 .xcassets 中的图片文件名
- 用别的电脑打包
已知问题
- 生成的垃圾代码文件可能是 .m 文件中实现的私有类,编译垃圾代码可能会报错,删除该垃圾代码 .h .m 文件及可。
git混淆代码地址:
二、修改方法名
先会class-dump. O(∩_∩)O谢谢。推荐San心两yi_钟的安装步骤
先大致解释一下“编译"、"反编译":
编译:就是把千千万万行字符串(也叫代码,或者源文件),变成010101010101(机器码,也叫目标代码)
编译过程:预处理-编译-汇编-链接
我的脚本运行在预处理阶段。
反编译:就是把0101010111110001100(机器码,也叫目标代码),变成千千万万行字符串(也叫代码,或者源文件)
最近三年一直待在银行做App,由于银行对安全要求较高,所以iOS的代码必须要有混淆的措施,初期实施了[念茜姐](http://blog.csdn.net/yiyaaixuexi/article/details/29201699)的混淆方案,但是领导说,我们要自动混淆,方法名字不能一个一个的添加到func.list中,所以方法名只能从.m和.h文件中抽取了,但是如何屏蔽系统的方法名,暂行的策略是:将自己定义的方法名全部添加一个前缀。
例如 “hsk_funtion1”; “hsk_funtion2”;“hsk_funtion3”;
在Xcode-->Target--->Build Phases--->添加Run Script
通过class-dump 反编译之后:Appdelegate 效果
通过class-dump 反编译之后:ViewController 效果
codeObfuscation.h宏定义文件、confuse.sh脚本文件、func.list函数列表文件的关系。
程序每次预处理,都就会执行confuse.sh,从.m和.h文件中按照"一定的规则"抽取需要混淆的函数名,全部写到func.list中,然后再从func.list中逐行提取函数名进行宏定义,宏定义使用随机字符串,然后写到codeObfuscation.h文件中。
func.list函数列表抽取,和宏定义是脚本自动完成,不需要手动抽函数和手动宏定义呢。
您的星星,是我最大的鼓励。最近想把HSKConfuse集成到CocoaPods,敬请期待。O(∩_∩)O谢谢
另送一份:iOS 脚本打包 傻瓜版,无需改变配置 github地址