簡介
給設(shè)備發(fā)個指令操作的第一步不是由MDM Server直接向APNs推送指令的,但是由Server向APNs發(fā)送一個特定的指令來好比喚醒設(shè)備,設(shè)備被喚醒之后會根據(jù)已安裝的配置文件的ServerURL 的地址主動發(fā)起請求,報告自己的當(dāng)前狀態(tài),只有其狀態(tài)值為
Idle設(shè)備才會接收Server指令操作。
如圖所示:

所以完成一次指令推送經(jīng)歷以下過程:
- 1、server 與APNs建立連接,發(fā)送數(shù)據(jù)。
- 2、當(dāng)設(shè)備收到APNs推送消息時,主動連接server報告本身的狀態(tài)空閑
- 3、server收到設(shè)備發(fā)來的狀態(tài)信息,發(fā)出操作命令
- 4、設(shè)備收到命令執(zhí)行,并返回數(shù)據(jù)
- 5、server響應(yīng),此次查詢完成,連接關(guān)閉。
以下以設(shè)備信息查詢指令DeviceInformation為例進(jìn)一步分析每個過程。
查詢設(shè)備信息的指令操作過程
- MDM Server 與 APNs建立連接,發(fā)送一個固定的指令,內(nèi)容如下。
token=8c20addf006e09842376d9066fda4147800bc98755eb0430027a1a2f94442418
payload=
{
"aps":
{
"sound":"default.caf"
},
"mdm":"EC0B1F96-5160-424C-A9DE-754A454E424B"
}
在這里需要我們前面得到的p12格式的證書,形式上和APP的差不多。其中token就是在TokenUpdate時的token,mdm是其中 的PushMagic,這個值是每次推送時都必須有的。所以根據(jù)內(nèi)容看出Sever與APNs推送的消息基本固定,不同于APP的消息推送。發(fā)送這個消息主要目的就是通知設(shè)備,MDM Server要給你發(fā)指令了,趕快去連接服務(wù)器。
- 當(dāng)設(shè)備收到APNs推送消息主動連接Server
收到有APNs發(fā)來的消息,發(fā)起請求到通過配置文件的服務(wù)器URL(即ServerURL字段的值)。向Server報告自己的當(dāng)前狀態(tài)是否空閑。
<?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>Status</key>
<string>Idle</string>
<key>UDID</key>
<string>233deb277d03bd4aaf91108390c7d*</string>
</dict>
</plist>
以上可以看出每次請求或應(yīng)答都會有UDID來標(biāo)記設(shè)備,Status的值表示設(shè)備當(dāng)前狀態(tài)。狀態(tài)值有以下幾種狀態(tài):
| Status value | Description |
|---|---|
| Acknowledged | 一切正常,設(shè)備正確響應(yīng)指令 |
| Error | 出現(xiàn)錯誤 |
| CommandFormatError | 指令格式錯誤 |
| Idle | 設(shè)備空閑 |
| NotNow | 設(shè)備收到指令,但不能馬上執(zhí)行以后會再次請求服務(wù)器 |
正常情況下大多數(shù)出現(xiàn)的是Acknowledged 和Idle兩種狀態(tài)。
- Server收到設(shè)備發(fā)來的狀態(tài)信息
收到設(shè)備狀態(tài)信息,判斷是否空閑,只有空閑的時候再去發(fā)送指令。發(fā)送查詢設(shè)備信息指令:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Command</key>
<dict>
<key>RequestType</key>
<string>DeviceInformation</string>
<key>Queries</key>
<array>
<string>ModelName</string>
<string>Model</string>
<string>BatteryLevel</string>
<string>DeviceCapacity</string>
<string>AvailableDeviceCapacity</string>
<string>OSVersion</string>
<string>SerialNumber</string>
<string>IMEI</string>
<string>ICCID</string>
<string>MEID</string>
<string>IsSupervised</string>
<string>IsDeviceLocatorServiceEnabled</string>
<string>IsActivationLockEnabled</string>
<string>IsCloudBackupEnabled</string>
<string>WiFiMAC</string>
<string>BluetoothMAC</string>
</array>
</dict>
<key>CommandUUID</key>
<string>f04997b8-aae2-44de-8c8d-8fb838000d0c</string>
</dict>
</plist>
Server發(fā)送一個命令操作時必定包含Command和 CommandUUID
Command必須有RequestType表示具體的命令操作 + 該命令相關(guān)的操作參數(shù)。以上命令用來查詢設(shè)備信息,Queries數(shù)組中表示要查詢的內(nèi)容的key。
CommandUUID表示命令的ID,當(dāng)設(shè)備響應(yīng)命令操作時,Sever可以此來確定是哪個命令操作,然后做相應(yīng)的數(shù)據(jù)處理。
- 設(shè)備收到命令執(zhí)行,根據(jù)指定的key返回相應(yīng)的數(shù)據(jù)
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CommandUUID</key>
<string>f04997b8-aae2-44de-8c8d-8fb838000d0c</string>
<key>QueryResponses</key>
<dict>
<key>AvailableDeviceCapacity</key>
<real>19.606937408447266</real>
<key>BatteryLevel</key>
<real>0.56000000238418579</real>
<key>BluetoothMAC</key>
<string>6c:70:9f:2b:46:72</string>
<key>DeviceCapacity</key>
<real>26.413677215576172</real>
<key>ICCID</key>
<string>8986 0113 7231 0048 6168</string>
<key>IMEI</key>
<string>35 884805 093285 4</string>
<key>IsActivationLockEnabled</key>
<false />
<key>IsCloudBackupEnabled</key>
<false />
<key>IsDeviceLocatorServiceEnabled</key>
<false />
<key>IsSupervised</key>
<false />
<key>MEID</key>
<string>35884805093285</string>
<key>Model</key>
<string>ME824CH</string>
<key>ModelName</key>
<string>iPad</string>
<key>OSVersion</key>
<string>9.2.1</string>
<key>SerialNumber</key>
<string>F4KMG0FSFLMM</string>
<key>WiFiMAC</key>
<string>6c:70:9f:2b:46:71</string>
</dict>
<key>Status</key>
<string>Acknowledged</string>
<key>UDID</key>
<string>233deb277d03bd4aaf91108390c7d9fe2c49c8be</string>
</dict>
</plist>
- server響應(yīng),若還需操作繼續(xù)發(fā)送指令,否則返回為空此次操作完成,斷開連接。
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Length: 0
Date: Wed, 26 Apr 2017 07:34:00 GMT
其他操作命令
- 查詢設(shè)備已安裝的應(yīng)用
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
<key>Command</key>
<dict>
<key>RequestType</key>
<string>InstalledApplicationList</string>
</dict>
<key>CommandUUID</key>
<string>149e4fd2-0267-4da2-9b58-bf94282dcdb4</string>
</dict>
</plist>
- 設(shè)備鎖屏命令
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Command</key>
<dict>
<key>RequestType</key>
<string>DeviceLock</string>
</dict>
<key>CommandUUID</key>
<string>07a6c20e-5e35-4f79-8680-10dee8460099</string>
</dict>
</plist>
- 清除密碼命令
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Command</key>
<dict>
<key>RequestType</key>
<string>ClearPasscode</string>
<key>UnlockToken</key>
<data>
// base64編碼的字符串(在TokenUpdate中獲取的UnlockToken字段的值)
</data>
</dict>
<key>CommandUUID</key>
<string></string>
</dict>
</plist>
命令的請求和響應(yīng)格式
- 命令請求格式
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Command</key>
<dict>
<key>RequestType</key>
<string>命令名字</string>
...其他字段或參數(shù)(可選),根據(jù)不同的命令會有不同的附加的key
</dict>
<key>CommandUUID</key>
<string></string>
</dict>
</plist>
- 命令響應(yīng)格式
<plist version="1.0">
<dict>
<key>CommandUUID</key>
<string>CommandUUID</string>
<key>Status</key>
<string>Acknowledged</string>
<key>UDID</key>
<string>[device UUID]</string>
</dict>
</plist>
由設(shè)備發(fā)起的請求或響應(yīng)操作基本是固定的,我們唯一能夠操作的也只有Sever端的請求和響應(yīng)了。
參考:
1、MDM協(xié)議官方文檔- Mobile Device Management Protocol Reference https://developer.apple.com/library/content/documentation/Miscellaneous/Reference/MobileDeviceManagementProtocolRef/3-MDM_Protocol/MDM_Protocol.html#//apple_ref/doc/uid/TP40017387-CH3-SW2
2、配置描述文件參考- Configuration Profile Referencehttps://developer.apple.com/library/content/featuredarticles/iPhoneConfigurationProfileRef/Introduction/Introduction.html#//apple_ref/doc/uid/TP40010206-CH1-SW1