从.mobileconfig获取设备UDID

时间:2011-04-25 17:52:20

标签: ios configuration utility udid

我正在尝试编写类似于http://whatismyudid.com/的函数,然后批准该函数将返回用户UDID并将其存储到数据库中以供将来与该用户一起使用。

我已经编写了一个在Profile Installer中打开的.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 个答案:

答案 0 :(得分:13)

我发现通过使用上面的说法,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}");

如果注册是一个目录 - 这会调用DirectoryIndex(通常是index.php),然后可以向您的用户显示内容。

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

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

然后你可以解析$ data字符串以获得你需要的东西(试试file_put_contents("data.txt", $data);或Kyle2011的例子)

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

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

答案 1 :(得分:6)

关于最后一页(文件夹)的注释。

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

你可以改变这个:

  

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

通过

  

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

来源:header function on php.net manual

这是工作!

答案 2 :(得分:1)

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

答案 3 :(得分: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请求主体,而不试图将其解析为通常的名称/值对。我此时建议reading the documentation,但它确实没有告诉你多少。

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