1、通過embeded.mobileprovision驗證
if let embeddedPath = Bundle.main.path(forResource: "_CodeSignature/CodeResources", ofType: ""),
let dic = NSMutableDictionary.init(contentsOfFile: embeddedPath),let files = dic["files"] as? [String:Any],let hashData = files["embedded.mobileprovision"] as? Data{
let hashValue = hashData.base64EncodedString()
let localHashValue = getHashValue()
if hashValue != localHashValue{//文件被篡改,退出
Toast.showInfo(content: "檢測到非法簽名,程序即將退出",duration: 3)
DispatchQueue.main.asyncAfter(deadline: .now()+3) {
exit(0) // (1)
}
}
}
embeded.mobileprovision文件會在上架appStore后被蘋果刪除,因為該文件中包含了證書相關(guān)信息,ipa包上傳到appstore后,蘋果會驗證證書的合法性,驗證通過后會刪除該文件,并對ipa包進(jìn)行重簽后上架appstore,這樣才能保證開發(fā)者自己的證書過期后依然可以通過appstore進(jìn)行下載。
但是如果ipa包被越獄手機(jī)二次簽名后,embeded.mobileprovision文件會重新生成,這時則可以監(jiān)測到文件是否被篡改來判斷是否被二次簽名。
2、判斷embeded.mobileprovision是否存在
基于上述原理,線上包是不存在embeded.mobileprovision這個文件的,如果是上架appstore的包,則可以通過判斷embeded.mobileprovision是否存在則可以判斷是否被二次打包。
3、其他方案
還有一些網(wǎng)上搜索到的方案,我沒有驗證過
通過判斷info.plist中是否存在SignerIdentity
NSBundle *bundle = [NSBundle mainBundle];
NSDictionary *info = [bundle infoDictionary];
if ([info objectForKey: @"SignerIdentity"] != nil)
{
return YES;
}
return NO;
通過對重要文件的hash值進(jìn)行校驗
可以在app中重要文件的hash值存儲到服務(wù)器,在app啟動是計算重要文件的hash值與服務(wù)器進(jìn)行對比。