通用技术 Apple configure profile

陈恒捷 · December 26, 2015 · Last by songz replied at December 28, 2015 · 1672 hits
本帖已被设为精华帖!

最近项目用到 mdm,研究研究着就找到了 configure profile 这个东西。经过一段玩耍,发现这玩意儿权限超乎想象,特此分享一下。

在 iOS 系统中,一直有一个神秘的区域,叫 "描述文件与设备管理"(Profile)。里面可以看到应用于这个设备的一些描述文件(profile)。我目前接触到这里可以见到的描述文件主要有4类:

  • 移动设备管理(MDM)
  • 配置描述文件(configure profile)
  • 企业级应用
  • 开发商应用(用自己的开发者账号在没购买开发者证书时进行真机调试,此处会出现自己的账号)

今天的主角就是其中的一个:配置描述文件(configure profile)

开场

先由一个 Demo 开场吧。大家按照以下步骤来做:

  1. 在你的 iPhone/iPad 上打开 这个链接
  2. 安装这个描述文件
  3. 好了,你试试看还能不能用摄像头?

还能使用摄像头的同学可以在回帖里说一下。

配置描述文件

从前面的 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.

要点:

  • 给大量设备分发配置信息
  • 它是一个 xml 文件
  • 它可以控制包括 email 设置、网络设置等 系统级别的设置

那么前面这个威力这么大的文件到底装了啥?

这是它的关键内容(全部内容有点大,大家用 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>

那么为什么用手机打开这个配置文件就会提示安装并且获得如此大的权限呢?原因是它为了利于分发,拥有非常多的部署方式:

  • 使用 Apple Configurator (iOS only)
  • 通过电子邮件附件
  • 通过网页(就是我们前面使用的方式)
  • 通过 OTA 部署
  • 通过 MDM 部署

可以设置的项

这个太多了,有 mac 的同学可以直接下载 Apple Configurator 。这里只放几个截图给大家领略一下:

其中有一些非常高的权限是需要被监督的设备才能生效。要把一台设备变成被监督设备,需要把它连接到装有 apple configurator 的 mac 上进行配置。这里我还没深入了解,先不说太多。

PS:这里有个逆天的设置:控制在何种环境下可以移除描述文件(最后一张图)。若设为“永不”,则除非用户接上了 iPhone Configuration Utility(有 windows 和 mac ,不过貌似已经被弃用了,和最新的 itunes 不能兼容),或者 Apple configurator(只有 mac 版),否则不越狱的情况下只能格机了。

而且,还有一些设置在 Apple Configurator 建立描述文件的 GUI 界面隐藏掉了,只有在 官方文档 中才有介绍。例如非常变态的 single application mode (就是商场展示时你无论如何都无法退出当前应用的那个模式)。当然,这么高的权限只能用在被监督的设备上。

手写一个 configure profile 文件

说是手写,当然不会是从 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
  • 它的下一行开始是 key 的内容。
  • 如果值的类型是 string 就用 <string></string>包住
  • 如果值的类型是 boolean 就是 <true/> 或者 <false/>
  • 如果值的类型是 dict ,就用 <dict></dict> 标签,里面再按照上面的规律来写内容

需要注意有一些 key 是所有权限都需要配置的,如 PayloadType

抛砖引玉

这些内容属于苹果的企业级管理方面的内容。相关内容很多,而且有部分文档并不会公开。也欢迎对这方面有所了解的同学可以进行补充~

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 1 条回复 时间 点赞

nice,学习了

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up