前言:开发iOS的朋友都知道,在功能开发完成后,我们就会用申请的苹果账号在后台做证书配置,然后提交到AppStore,但是也有部分APP我们不需要提交到AppStore,比如内部测试用的APP、定制给客户开发的功能性APP、还有其他一些不适合提交到AppStore的APP,那么这时候我们就仅需要针对特定的人群或部分手机设备来安装,最简单方式就是把需要安装的设备UDID作为测试机在配置文件中添加,最多可添加100台设备,另外一种方案就是采用企业证书重新打包,这样就不限制设备数量,相对来说简单,此外还有一种情况就是我们对开发完成的ipa文件做重签名处理,这种情况通常是没有源码的情况,不能用xcode打包签名,那么问题来了,如果对这些签名打包后的ipa文件,也就是如何对这些APP做后期跟踪管理呢?
管理APP常用到的几个场景:
场景一:某几个客户测试安装后,在特定时间到了就不允许在打开使用,比如打开APP后立马闪退或弹窗提醒时间到,点击确定后闪退,如果想延长,可修改到期时间,就能继续使用。
场景二:APP因某些原因,暂停对客户的继续使用,即关闭APP的使用权限,打开后立马闪退,一旦修复后开启APP的使用权限,客户照旧正常使用。
场景三:源码丢失无法打包新APP,但需要给APP新增一些小功能,比如添加统计等,这时候就需要注入动态库,之后重签名ipa,这时候依然需要对APP做管理。
场景三:客户对我们重签名后的APP使用到期后,没有不再续费,但是客户依然能使用,我们又对证书没有管理权限,无法撤销,这就导致了客户付款一个月,但是实际上却一直可以使用,对此也无能为力,这时候就需要对APP做管理,如时间锁或开关功能,特别是企业重签名的,对证书的影响最大,有可能导致证书被封的危险。
场景四:对于APP的多开支持,比如重签名时候我们可以修改名称或自定义Bundle ID,以此来实现同设备安装多个APP的需要,便于测试或其它作用。
其他场景:暂未知...
针对这些常见场景,笔者做了统计和调查,发现市面上能解决的几乎寥寥无几,特别一些能实现时间锁的都要提交证书和密码,这对于签名来说太危险,一旦提交后,有可能P12证书和密码泄露,导致证书被共享最终被封,目前据笔者所知,企业账号一号难求,价格也在几十万,被封是非常可惜的,故此基本无人敢使用这类软件做管理,比如xx开心、一键xx工具等,如下图,太危险了。
对于场景中提到的几个关键词,比如时间锁、开关、注入动态库和修改APP名称和ID,从开发专业角度来分析如何技术实现:
时间锁:顾名思义就是设定时间,一到时间到就锁住,不允许再使用,从开发角度来说,我们就是设定了未来时间,当APP运行到这个时间点,判断当前时间大于预定时间即开启锁功能,弹窗提醒或直接exit(0)闪退。
开关:与时间锁类似,但是更直接,可立即关闭或禁用,这种需要服务器支持,和时间锁不同,时间锁可以实现离线模式,不过这种一旦到期就不能再继续使用,如果和开关一样采取服务器模式就可以再次延长时间,那么这种就需要调用服务器接口,对于开发来说不难。
注入动态库:这需要开发独立的动态库文件,动态库是应用启动后就立即加载,我们可以在加载时候调用load方法里面执行我们需要的统计等功能,注入方式也还是简单,采用yololib,下载地址:https://github.com/KJCracks/yololib 或optool 下载地址:https://github.com/alexzielenski/optool 来注入,例如:
yololib FileName Frameworks/Dylib.dylib
或
optool install -c load -p "@executable_path/Frameworks/libSignatureCheck.dylib" -t xxx
就可以注入到ipa文件中,通过MacOView这款工具来查看Mach-O文件是否注入成功,如果不喜欢命令行的可以通过工具来注入,推荐用iReSignDylib这款mac软件来操作,下载地址: https://github.com/mapboo/iReSignDylib,界面如下:
从这款软件来看,界面操作还是很清楚的,拖入动态库文件.dylib就可以了。
修改APP名称和ID:了解APP开发的朋友都知道,名称和ID可以直接在info.plist文件中修改,那么我们通过修改info文件里面对应的key值:
<key>CFBundleDisplayName</key> //APP名称
<key>CFBundleIdentifier</key> //APP的BundleID
然后重新覆盖这个info文件,得此达到修改的目的,特别注意的是一旦修改过ipa文件里面的任何地方,都会破坏原有签名,必须重新用苹果证书签名,这点和Android的重签名是一样的,比如我们用apktool工具反编译apk后再回编译,那么这时候就必须要重新签名才能安装到手机上,iOS也是一样。
这几个关键技术点,对于正常开发内嵌原生代码来说,都是非常容易实现的,如果是外面嵌入来管理呢,那就不是技术能解决的问题了,简单的一个案例:手头只有ipa文件,需要实现时间锁、开关等功能,那就只能通过重签名来管理了。笔者在考察众多技术和实践测试方案后,确实找到了一款满足常见场景功能的Mac软件,即风车签名管理软件,官网地址:点这里查看。
软件简介:这是一款在Mac平台下安全可控的iOS签名管理软件,旨在对签名后的APP能够完全控制,包括APP的开启或禁用、设置到期时间锁、注入第三方动态库文件、设置安装限量、修改APP名称和自定义Bundle ID等刚需功能,同时支持个人、公司和企业证书签名,最重要的是软件在签名时无需填写证书密码,一切操作均在本地Mac电脑中,确保证书安全。
针对软件功能笔者做了一系列的实践验证,风车签名软件操作界面非常清晰明了,如下图:
特别该软件签名证书不再需要密码,这个是必须点赞的,安全第一啊,另外设置时间锁、修改名称ID、注入动态库,以及打印日志信息都非常明了,特别时间锁默认三个月也可以自定义到期时间,很nice了,故此笔者做个签名测试,设置时间锁功能,首先在设置里面输入:
然后我找了个ipa来签名试一试,笔者是用的个人证书,手机UDID已经添加进去了,如果你是企业证书,那就不需要了,签名后我用iFunbox直接安装,打开APP看看是否弹出提醒时间,测试效果如下:
其它该软件的功能,如开关、注入动态库,以及修改APP名称等功能笔者都做了测试,效果不错,杠杠的,我就不这里截图了,总之是一款非常安全可控的iOS签名管理软件,值得推荐,更多功能,大家可以去官网一探究竟啦。