iOS MDM詳解(5)— 給設(shè)備發(fā)個指令操作

簡介

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

如圖所示:

MDM工作流程
MDM工作流程

所以完成一次指令推送經(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)的是AcknowledgedIdle兩種狀態(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ā)送一個命令操作時必定包含CommandCommandUUID

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容