最近项目用到 mdm,研究研究着就找到了 configure profile 这个东西。经过一段玩耍,发现这玩意儿权限超乎想象,特此分享一下。
在 iOS 系统中,一直有一个神秘的区域,叫 "描述文件与设备管理"(Profile)。里面可以看到应用于这个设备的一些描述文件(profile)。我目前接触到这里可以见到的描述文件主要有 4 类:
今天的主角就是其中的一个:配置描述文件(configure profile)
先由一个 Demo 开场吧。大家按照以下步骤来做:
还能使用摄像头的同学可以在回帖里说一下。
从前面的 Demo 大家应该可以看到这个描述文件的威力了吧。不用害怕,我预留了后路给大家。大家可以通过 设置->通用->描述文件与设备管理 里面找到 NoCamera 这个描述文件,点进去把它删掉,那么你的摄像头就回来了。
那么,什么是配置描述文件?
我们看看官方的描述:
A configuration profile is an XML file that allows you to distribute configuration information. If you need to configure a large number of devices or to provide lots of custom email settings, network settings, or certificates to a large number of devices, configuration profiles are an easy way to do it.
要点:
那么前面这个威力这么大的文件到底装了啥?
这是它的关键内容(全部内容有点大,大家用 pc 去下载这个配置文件来查看就好了)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>PayloadDescription</key>
<string>Configures restrictions</string>
<key>PayloadDisplayName</key>
<string>Restrictions</string>
<key>PayloadIdentifier</key>
<string>com.apple.applicationaccess.6BAC7EBC-5D71-4E6C-9C82-93BEC47476E2</string>
<key>PayloadType</key>
<string>com.apple.applicationaccess</string>
<key>PayloadUUID</key>
<string>32F37582-1C7C-4AFD-9B6C-DF888D3BC343</string>
<key>PayloadVersion</key>
<integer>1</integer>
...
<key>allowCamera</key>
<false/>
...
</dict>
</array>
<key>PayloadDisplayName</key>
<string>NoCamera</string>
<key>PayloadIdentifier</key>
<string>testerhome</string>
<key>PayloadRemovalDisallowed</key>
<false/>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>5A9E427E-BAD8-4827-9CBC-F0AF0CD5E809</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>
那么为什么用手机打开这个配置文件就会提示安装并且获得如此大的权限呢?原因是它为了利于分发,拥有非常多的部署方式:
这个太多了,有 mac 的同学可以直接下载 Apple Configurator 。这里只放几个截图给大家领略一下:
其中有一些非常高的权限是需要被监督的设备才能生效。要把一台设备变成被监督设备,需要把它连接到装有 apple configurator 的 mac 上进行配置。这里我还没深入了解,先不说太多。
PS:这里有个逆天的设置:控制在何种环境下可以移除描述文件(最后一张图)。若设为 “永不”,则除非用户接上了 iPhone Configuration Utility(有 windows 和 mac ,不过貌似已经被弃用了,和最新的 itunes 不能兼容),或者 Apple configurator(只有 mac 版),否则不越狱的情况下只能格机了。
而且,还有一些设置在 Apple Configurator 建立描述文件的 GUI 界面隐藏掉了,只有在 官方文档 中才有介绍。例如非常变态的 single application mode(就是商场展示时你无论如何都无法退出当前应用的那个模式)。当然,这么高的权限只能用在被监督的设备上。
说是手写,当然不会是从 0 开始写,而是基于前面的这个配置文件来编写。
这里以 app lock 为例子。具体文档可查询:App lock
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>HasRemovalPasscode</key>
<false/>
<key>PayloadContent</key>
<array>
<dict>
<key>PayloadDescription</key>
<string>OnlyPhoto</string>
<key>PayloadDisplayName</key>
<string>OnlyPhoto</string>
<key>PayloadIdentifier</key>
<string>com.apple.app.lock.AA20694D-F777-4158-A818-C703217E9D66</string>
<key>PayloadType</key>
<string>com.apple.app.lock</string>
<key>PayloadUUID</key>
<string>3F9C2B2F-A263-4467-87EE-5E520F970AEA</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>App</key>
<dict>
<key>Identifier</key>
<string>com.apple.mobileslideshow</string>
<key>Options</key>
<dict>
<key>DisableTouch</key>
<true/>
<key>DisableDeviceRotation</key>
<true/>
<key>DisableVolumeButtons</key>
<true/>
<key>DisableRingerSwitch</key>
<true/>
<key>DisableSleepWakeButton</key>
<true/>
<key>DisableAutoLock</key>
<true/>
</dict>
</dict>
</dict>
</array>
<key>PayloadDisplayName</key>
<string>OnlyPhotos</string>
<key>PayloadIdentifier</key>
<string>hengjiechjs-mac-mini.local.D2BB968B-4AA2-4795-AFE6-C5B2CC77227B</string>
<key>PayloadRemovalDisallowed</key>
<false/>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>33EC9B0F-C364-46FE-97DA-0D797F674CD2</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>
规律很简单:
<key></key>
标签里面是 key name<string></string>
包住<true/>
或者 <false/>
<dict></dict>
标签,里面再按照上面的规律来写内容需要注意有一些 key 是所有权限都需要配置的,如 PayloadType
。
这些内容属于苹果的企业级管理方面的内容。相关内容很多,而且有部分文档并不会公开。也欢迎对这方面有所了解的同学可以进行补充~