前言
本工具用于應對蘋果對重復應用的審核(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地址