从.mobileconfig获取设备UDID

问题描述:

我试图编写类似于http://whatismyudid.com/的函数,然后通过验证,它将返回用户UDID并将其存储到数据库中以供将来与该用户参考。从.mobileconfig获取设备UDID

我已经编写了一个.mobileconfig xml文档,可以在Profile Installer中打开,但是当我告诉它安装配置文件时,它将以[alert] Invalid Profile响应,但没有提示主体。没有说明,没有代码,没有帮助。

我是新来的移动配置游戏,所以任何帮助都会让我兴奋不已。

这里是我的配置文件:

<?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> 
    <dict> 
     <key>URL</key> 
     <string>http://apps.mortlabs.com/device/retrieve.php</string> 
     <key>DeviceAttributes</key> 
     <array> 
      <string>UDID</string> 
      <string>IMEI</string> 
      <string>ICCID</string> 
      <string>VERSION</string> 
      <string>PRODUCT</string> 
     </array> 
    </dict> 
    <key>PayloadOrganization</key> 
    <string>MortLabs.com</string> 
    <key>PayloadDisplayName</key> 
    <string>Profile Service</string> 
    <key>PayloadVersion</key> 
    <integer>1</integer> 
    <key>PayloadUUID</key> 
    <string>B958E359-34C2-42F4-BD0C-C985E6D5376B</string> 
    <key>PayloadIdentifier</key> 
    <string>com.mortlabs.profile-service</string> 
    <key>PayloadDescription</key> 
    <string>This temporary profile will be used to find and display your current device's UDID.</string> 
    <key>PayloadType</key> 
    <string>Profile Service</string> 
</dict> 
</plist> 

剖面由导航到http://apps.mortlabs.com/device/enroll.php与移动Safari

我发现通过使用上述Apache正在与Ipad/Iphone进行对话 - 由Kyle2011发布的帖子在https://discussions.apple.com/thread/3089948?start=0&tstart=0填充了解决方案的其余部分。

header("Location: https://www.example.com/enrolment?params={$params}"); 

凡招生是一个目录 - - 这然后调用:

在您需要使用类似于下面一行到浏览器的目录重定向retrieve.php页面底部

基本上DirectoryIndex(通常是index.php),然后可以将东西显示给用户。

要填充你需要在你的retrieve.php脚本的顶部以下行到$ params变量

$data = file_get_contents('php://input'); 

然后,您可以解析$数据串来获得你所需要的(尝试file_put_contents("data.txt", $data);或Kyle2011的榜样)

我还通过在Mac终端上使用udidgen而不是仅仅使用whatismyudid.com,将Payload UDID更改为不同的东西。

更新:在iOS 7.1中,某些文件(.plist IIRC)需要通过https://提供服务 - 如果所有内容都通过http://提供,它们将无法安装 - 可能最适合包括.ipa通过https://确保Apple未来的更改不会导致问题。

+0

Kev!太棒了,我会尽快尝试,让你知道它是如何工作的。如果它解决了问题,那么我给你道具。 – joseym 2011-06-25 17:06:30

+0

可以通过asp.net获取吗? – 2013-02-08 06:20:52

+0

我怎样才能从.mobileconfig文件的asp.net c#中获得udid? – 2013-02-08 06:32:22

尝试设置的URL地址,而不PHP扩展初始化。这解决了我的问题。 现在我唯一的问题是,我无法找到如何检索从iOS设备发送到我的服务器的数据。 它似乎不在$ _POST变量中。

+1

刚回来,但我想我可以帮助你解决你的问题,然后我会尝试你的建议!这些信息应该存储在php输入流中,所以你应该可以像'$ return = file_get_contents('php:// input');' – joseym 2011-05-10 15:11:43

+0

去除.php没有帮助,不幸 – joseym 2011-05-11 21:29:12

您得到的错误是因为iOS期望您的配置文件服务URL(它发送其UDID的URL)返回配置文件(即.mobileconfig文件)。我目前捕获设备UDID而不返回此配置文件;我的设备会生成您描述的警报,但数据位于我的服务器上。

仅供参考,这里是非常简单的PHP我用它来采集数据文件:

<?php 
// set file to write 
$file = 'device_data/data.p7s'; 

$fp = fopen($file, 'w') or die('Could not open file!'); 
fwrite($fp, $HTTP_RAW_POST_DATA) or die('Could not write to file'); 
fclose($fp); 
?> 

这里的关键是使用$HTTP_RAW_POST_DATA变量的准确捕捉HTTP请求主体为发送,而不试图将其解析为通常的名称/值对。在这一点上,我建议reading the documentation,但它确实没有告诉你很多。

安全提示:无论用户在请求正文中发送了什么,您都正在写入服务器上的文件。如果用户决定发送一个shell脚本,PHP文件或其他可执行内容,然后访问您创建的文件的URL,他们可以执行刚刚上传到您的Web服务器上的代码。因此,确保您写入的文件不能通过HTTP访问! (A .htaccess文件会执行此操作,或者写入web根目录之外的某个位置。)

关于最后一页(FOLDER)的注意事项。

如果您想使用页面脚本进行最终重定向而不是文件夹。

你可以改变这一点:

标题( “位置: https://www.example.com/enrolment?params= {$ PARAMS}”);

通过

标题( “位置: https://www.example.com/enrolment.php?params= {$ PARAMS}”,真实,301);

来源:header function on php.net manual

它的工作!

+3

对于其他人,如果您没有301重定向,您将收到一个无效的配置文件。 – Rudiger 2014-02-21 03:34:39