上午写了个脚本,想着很久都没写博客了,所以就有了这篇博客。其实我也不想水博客,只是我现在在除 iOS 外的其他领域也是初学者状态,就觉得在别的领域到现在还没能找到一点可以写的内容。(当我想到这里的时候,我希望这是我写的最后一篇和 iOS 开发有关的内容了),好了,开始正文。。。

现在苹果企业开发者账号那么难申请,估计已经没多少人还在用企业账号了。不过话说回来,确实好多公司都没必要使用企业开发者账号,毕竟企业开发者账号的初衷是用于企业内部 App 的发布,而有在内部发行专门的 App 的企业又有几个呢?

不过在一些大型劳动密集型的企业里,苹果企业账号就有它的用武之地了。假如你在这样的企业,企业旗下有多个部门在做移动开发,这些部门共用一个开发者账号,那么这个企业账号下的应用的数量就比较多了。

这里需要先介绍一下企业账号的优缺点:

  • 优点:
    1. 不需要 App Store 审核。因为企业账号打包的 App 只能发布于公司内部网站,所以不存在 App Store 审核的问题,发布流程大大简化。不过这也导致一些人利用这种机制来钻空子导致企业账号滥用,以至于现在基本上申请不到新的企业账号。
    2. 没了,没了,剩下的都是缺点。
  • 缺点:
    1. 发布证书过期后,已安装的 App 就打不开了。
    2. 配置文件(provisioning profile)文件过期后,已安装的 App 也打不开了。
    3. 没办法上 App Store,这样也就没办法像 App Store 里的应用可以自动更新。
    4. 发布时服务器需要部署 TLS。
    5. 用户安装 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