草庐IT

ios - 如何在iOS中开发移动设备管理应用程序

coder 2023-07-26 原文

我公司中有很多iOS设备,并且必须集中管理它们,因此我们尝试将第三方MDM应用程序用于例如airwatch,但是这非常昂贵。

我们决定不使用它,并正在考虑从头开始创建MDM。我们尝试了所有在线可用的解决方案,但没有任何解决方案。谁能帮我这个忙。

最佳答案

iOS MDM是无客户端协议(protocol)。因此,您开发了服务器,但没有为其开发客户端应用程序。实际上,有一个客户端应用程序,但是它是由Apple开发并内置在操作系统中的。

因此,您的服务器将发送命令,内置MDM客户端将接收并执行该命令。

一般来说,如果要开发MDM服务器,则需要注册到Enterprise Developer Program并获取MDM文档。

我相信here文档可以帮助您从头开始创建自己的mdm解决方案

Reference

有关开发mdm服务器的其他一些有用的链接
Ref 1
Ref 2

这是堆栈溢出浏览中MDM tag的链接,这将帮助您获得大多数常见问题的答案。

如果您希望在完成此操作时获得任何澄清,请在下面评论。
我已经准备好帮你

更新

概述

  • 为了管理设备,我们可以使用iOS设置应用程序手动对其进行配置

    但是它存在可伸缩性问题,并且需要手动配置每个设备的大量工作,并且需要物理访问
  • ,因此苹果引入了iPCU(iPhone配置实用程序)工具,使用该工具我们可以创建配置文件(.moibleconfig),并且可以通过USB或OTA(无线)进行安装

    但这需要用户交互
  • 因此苹果为iOS引入了MDM服务,它不需要用户交互,我们无需用户同意就可以很轻松地完成很多事情,例如远程锁定,解锁,擦除,配置邮件等。

    MDM基本上是一种协议(protocol),您可以使用该协议(protocol)远程管理设备。

    概述

    我们在iOS设置应用中所做的更改存储在
    /var/mobile/Library/ConfigurationProfiles作为.plist文件以及iPCU和MDM安装的配置文件(.plist)

    假设我们要关闭设备中的App Store应用程序安装,因此我们将转到Settings-> Restrictions并关闭App Store安装,以便allowAppInstallation在其configuration(.plist)中设置为false正在使用iPCU和MDM配置应用安装,然后在iOS上,当iOS设置应用配置文件,iPCU配置文件和MDM配置文件的配置文件之间发生冲突时,我们将采用限制性最强的一种。

    iOS通过合并所有这些配置文件来创建一个名为ProfileTruth.plist的配置文件,iOS相对于该plist可以工作

    MDM基本上由这些东西组成
  • iOS设备

    它可以是任何使用iOS运行的设备。所有iOS设备都具有内置的MDM客户端,它将根据MDM服务器
  • 的指令进行操作
  • MDM服务器

    它基本上是一个托管在应用程序或Web服务器上的应用程序,并将命令提供给iOS设备上托管的MDM客户端
  • 信令

    在我们的情况下,这是一种从服务器调用mdm客户端的机制,它是APNS

  • 随函附上MDM工作流程


  • MDM服务器使用APNS发送通知
  • APNS将其传送到设备
  • 内置MDM客户端连接到MDM Server
  • 连接后,MDM Server将发回排队的命令发送给客户端,并且客户端根据MDM服务器发送的命令进行操作,并以适当的确认答复MDM服务器

  • 创建简单MDM的步骤

    MDM注册

    它始于MDM注册资料

    在iPCU中,您可以选择MDM有效负载来创建新的配置文件



    checkin 网址
     The is the URL where enrolment of the device happens. 
    
     i.e upon installation of profile on the device MDM client sends necessary information to the MDM server which MDM server will use to authenticate and connect with the device 
    

    服务器网址
     Once the MDM server got the enrolment information.It can use the information to connect the device using APNS and when MDM client wakes up it connects with the URL mentioned in Server URL and Server can send back the queued commands to MDM client
    

    话题
    Enter the subject of APNS certificate that's going to be used for MDM.
    

    身份
    It can be any certificate generated by Certificate Assistant but important thing is it has to be signed by globally trusted CA or in the case of self signed CA the CA has be installed in the device.
    

    安装MDM注册配置文件

    您可以使用无线或USB安装此配置文件

    安装后,iOS内置客户端将通过身份验证请求连接到MDM服务器( checkin URL)

    输入:/checkin
    <?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>MessageType</key>
         <string>Authenticate</string>
         <key>Topic</key>
         <string>com.example.mdm.pushcert</string>
         <key>UDID</key>
         <string> [ redacted ] </string>
     </dict>
     </plist>
    

    现在服务器可以接受或拒绝Authenticate请求。为了接受,服务器必须以空白plist进行响应


      <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
         "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
         <plist version="1.0">
         <dict>
         </dict>
         </plist>
    

    收到响应后,MDM客户端将发送TokenUpdate请求

    输入:/checkin
     <?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>MessageType</key>
         <string>TokenUpdate</string>
         <key>PushMagic</key>
         <string> [ redacted uuid string ] </string>
         <key>Token</key>
         <data> [ 32 byte string, base64 encoded, redacted ] </data>
         </data>
         <key>Topic</key>
         <string>com.example.mdm.pushcert</string>
         <key>UDID</key>
         <string> [ redacted ] </string>
         <key>UnlockToken</key>
         <data>
            [ long binary string encoded in base64, redacted ]
         </data>
     </dict>
     </plist>
    

    再次,服务器需要发送一个简单的plist来完成注册过程

    MDM服务器必须在服务器中存储以下 key

    PushMagic

    服务器必须将此附加到它发送来连接MDM客户端的所有Push通知中

    代币

    标识设备到APNS的唯一ID

    解锁 token

    用于清除设备密码的 key 。

    管理设备

    现在,服务器必须通过将上述Token传递给Push通知库的Token和Pushmagic的有效负载作为 key MDM的值来发送推送通知
     {"mdm":"996ac527-9993-4a0a-8528-60b2b3c2f52b"}
    

    看到此有效载荷中不存在APS

    设备收到推送通知后,MDM客户端将与服务器URL而非状态为“空闲”的“ checkin URL”联系

    PUT:/服务器
     <?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> [ redacted ] </string>
     </dict>
    </plist> 
    

    然后,服务器将使用已排队等待该设备的任何命令进行响应。

    让我们来看一个设备锁定的示例
     The server has to respond with command like this to the client request
    
     <?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></string>
     </dict>
    </plist>
    

    当MDM客户端收到较早发送的状态闲置请求时,它将立即锁定设备并通过以下标准确认响应服务器
    <?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>CommandUUID</key>
               <string></string>
               <key>Status</key>
               <string>Acknowledged</string>
               <key>UDID</key>
               <string> [ redacted ] </string>
         </dict>
        </plist> 
    

    您可以在这里找到一些命令列表



    就是这样,这种方法可以做一个简单的演示事情。

    笔记:

    我会在这里尝试微调或添加更多内容,以便于理解

    关于ios - 如何在iOS中开发移动设备管理应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41065620/

    有关ios - 如何在iOS中开发移动设备管理应用程序的更多相关文章

    1. ruby - 如何在 Ruby 中顺序创建 PI - 2

      出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

    2. ruby - i18n Assets 管理/翻译 UI - 2

      我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

    3. ruby - 将差异补丁应用于字符串/文件 - 2

      对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

    4. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

      如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

    5. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

      我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

    6. ruby - 多次弹出/移动 ruby​​ 数组 - 2

      我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

    7. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

      我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

    8. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

      exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

    9. ruby-on-rails - Rails 应用程序之间的通信 - 2

      我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

    10. ruby - 无法运行 Rails 2.x 应用程序 - 2

      我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

    随机推荐