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后被苹果删除,因为该文件中包含了证书相关信息,ipa包上传到appstore后,苹果会验证证书的合法性,验证通过后会删除该文件,并对ipa包进行重签后上架appstore,这样才能保证开发者自己的证书过期后依然可以通过appstore进行下载。
但是如果ipa包被越狱手机二次签名后,embeded.mobileprovision文件会重新生成,这时则可以监测到文件是否被篡改来判断是否被二次签名。
2、判断embeded.mobileprovision是否存在
基于上述原理,线上包是不存在embeded.mobileprovision这个文件的,如果是上架appstore的包,则可以通过判断embeded.mobileprovision是否存在则可以判断是否被二次打包。
3、其他方案
还有一些网上搜索到的方案,我没有验证过
通过判断info.plist中是否存在SignerIdentity
NSBundle *bundle = [NSBundle mainBundle];
NSDictionary *info = [bundle infoDictionary];
if ([info objectForKey: @"SignerIdentity"] != nil)
{
return YES;
}
return NO;
通过对重要文件的hash值进行校验
可以在app中重要文件的hash值存储到服务器,在app启动是计算重要文件的hash值与服务器进行对比。