从.mobileconfig获得设备UDID

24

我正在尝试编写类似于 http://whatismyudid.com/ 的函数,一旦得到批准,将返回用户的UDID并将其存储到数据库中以供日后参考。

我编写了一个.mobileconfig xml文档,在配置文件安装器中打开没有问题,但当我告诉它安装配置文件时,它会响应[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>

通过移动版 Safari 浏览器导航至 http://apps.mortlabs.com/device/enroll.php 来初始化配置文件。

4个回答

14

通过上述方法,我发现iPad/iPhone正在与Apache通信 - Kyle2011在https://discussions.apple.com/thread/3089948?start=0&tstart=0帖子中提供了解决方案的其余部分。

基本上,在retrieve.php页面的底部,您需要使用类似以下行的语句将浏览器重定向到一个目录:

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

如果enrolment是一个目录,那么它会调用DirectoryIndex(通常是index.php),然后可以向用户显示内容。

要填充$params变量,您需要在retrieve.php脚本顶部添加以下行:

$data = file_get_contents('php://input');
你可以解析 $data 字符串以获取所需信息(尝试使用 file_put_contents("data.txt", $data); 或 Kyle2011 的示例)。
我还通过在 Mac 终端中使用 udidgen 而非仅使用 whatismyudid.com 的内容将 Payload UDID 更改为不同的值。
更新:从 iOS 7.1 开始,一些文件(如 .plist 文件)需要通过 https:// 进行访问 - 如果所有内容都通过 http:// 进行访问,则会导致安装失败 - 最好包括 .ipa 在内的所有内容都通过 https:// 进行访问,以确保苹果方面未来的更改不会引起问题。

Kev!太棒了,我马上试一下,然后告诉你它的效果如何。如果它解决了问题,那么我会给你点赞。 - joseym
我可以通过ASP.NET获取这个吗? - immayankmodi
如何从.mobileconfig文件中使用ASP.NET C#获取UDID? - sejal patel
对我来说,<string>http://apps.mortlabs.com/device/retrieve.php</string> 是以 GET 方法打开的。因此,我无法在 file_get_contents('php://input') 中获取数据。 - Valarpirai

7

3
如果您没有进行301重定向,您的个人资料可能会被视为无效。 - Rudiger

1
你遇到的错误是因为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请求正文,而不尝试将其解析为通常的名称/值对。我建议您阅读文档,但它真的没有告诉你太多。

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


1

尝试将URL设置为没有.php扩展名的地址。这对我解决了问题。 现在我的唯一问题是我找不到如何检索从iOS设备发送到我的服务器的数据。 它似乎不在$_POST变量中。


1
刚回来看到了你的消息,我想我可以帮你解决这个问题,然后我会尝试你的建议!信息应该存储在PHP输入流中,所以你应该能够做类似于$return = file_get_contents('php://input');这样的事情。 - joseym
删除 .php 后缀没有帮助,不幸的是。 - joseym

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接