脚本监控苹果企业开发者账号配置文件有效期
上午写了个脚本,想着很久都没写博客了,所以就有了这篇博客。其实我也不想水博客,只是我现在在除 iOS 外的其他领域也是初学者状态,就觉得在别的领域到现在还没能找到一点可以写的内容。(当我想到这里的时候,我希望这是我写的最后一篇和 iOS 开发有关的内容了),好了,开始正文。。。
现在苹果企业开发者账号那么难申请,估计已经没多少人还在用企业账号了。不过话说回来,确实好多公司都没必要使用企业开发者账号,毕竟企业开发者账号的初衷是用于企业内部 App 的发布,而有在内部发行专门的 App 的企业又有几个呢?
不过在一些大型劳动密集型的企业里,苹果企业账号就有它的用武之地了。假如你在这样的企业,企业旗下有多个部门在做移动开发,这些部门共用一个开发者账号,那么这个企业账号下的应用的数量就比较多了。
这里需要先介绍一下企业账号的优缺点:
- 优点:
- 不需要 App Store 审核。因为企业账号打包的 App 只能发布于公司内部网站,所以不存在 App Store 审核的问题,发布流程大大简化。不过这也导致一些人利用这种机制来钻空子导致企业账号滥用,以至于现在基本上申请不到新的企业账号。
- 没了,没了,剩下的都是缺点。
- 缺点:
- 发布证书过期后,已安装的 App 就打不开了。
- 配置文件(provisioning profile)文件过期后,已安装的 App 也打不开了。
- 没办法上 App Store,这样也就没办法像 App Store 里的应用可以自动更新。
- 发布时服务器需要部署 TLS。
- 用户安装 App 后,需要在设置里“信任开发者”,才能使用 App。
这里要说明的是,企业应用也可以通过自己搭建 MDM 服务器的方式来实现自动更新应用,但到目前为止,我还没见过投入 MDM 的公司。 如果你是通过搜索引擎来到这里,如果贵公司同样申请不下企业开发者账号,本人建议了解一下Apple 商务,本人认为 Apple 商务是企业开发者账号的替代品。
(接上文),可以看到,企业账号发布的应用一旦配置文件过期,已安装的 App 就打不开了,而这个配置文件的有效期只有短短的一年。如果我们没有 MDM,那唯一能做的就是在配置文件过期前让用户更新 App,通过更新使用新的配置文件打包的 App 来更新配置文件。
如果公司的企业开发者账号只有个别应用,还可以在脑子里记住过期时间,但如果开发的应用多了,那么就需要用工具来提醒自己了,当然最简单的方式就是在手机上设置一个脑子,应用快过期的时候来提醒你。
我最初想到的也是设置闹钟,但是我迟迟没有动手。仔细想想,设置/维护十几二十个闹钟也是一项大工程,能写几行代码就搞定的事,为什么要干成体力活呢?
于是我就画一两个个小时写了一个脚本,虽然可能我设置闹钟反而用不了这么长时间。。。如果这个脚本其他人也会用到,那么我这一两个小时就花的值了,虽然这种需求实在太少了,最起码我在别的公司没遇到过。其实这个脚本的内容很简单,就是遍历自己电脑上的配置文件,并查看其有效期,根据有效期的剩余时间来判断是否该提醒自己了。另外,这个脚本可以再改进一下,先是配置开机自动执行这个脚本,然后提醒方式改为弹窗提醒。
#!/bin/bash
##############################################################
# Author: scfhao
# Desciption: 检查本地 Provisioning Profile 文件的有效期
# 虽然没什么用,但还是贴出来了
##############################################################
# 配置 PlistBuddy 环境变量
PATH=$PATH:/usr/libexec
# Profile 中的日期是英文格式,将 LANG 切换为英文才可正常解析到日期
LANG="en_US.UTF-8"
# 定义提醒时间限制 31 天
((limit=31*24*60*60))
#for file in ~/Library/MobileDevice/Provisioning\ Profiles/*
for file in ~/Library/MobileDevice/MonitorProfiles/*
do
if [[ "${file##*.}" = "mobileprovision" ]]; then
expirationDate=`PlistBuddy -c "Print ExpirationDate" /dev/stdin <<< $(security cms -D -i "$file")`
# 获取过期时间的时间戳(秒)
expirationTs=`date -j -f "%a %b %d %T %Z %Y" "$expirationDate" +%s`
# 获取当前时间(秒)
currentTs=`date +%s`
# 计算剩余时间
((remain=$expirationTs-$currentTs))
# 判断剩余时间是否小于要提醒自己的时间
if [[ $expirationTs-$currentTs -lt $limit ]]; then
appID=`PlistBuddy -c "Print Entitlements:application-identifier" /dev/stdin <<< $(security cms -D -i "$file")`
echo "配置文件 $appID 即将到期,请及时更新!"
fi
fi
done