从.mobileconfig获取设备UDID

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

我写了一个.mobileconfig xml文档,在configuration文件安装程序中打开就好了,但是当我告诉它安assembly置文件时,它会响应[alert] Invalid Profile但没有警报主体。 没有描述,没有代码,没有帮助。

我是新手到移动configuration游戏,所以任何帮助会让我兴奋。

这是我的configuration文件:

 <?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来初始化configuration文件

我发现通过使用上面的那个Apache被Ipad / Iphone讨论了 – Kyle2011的post在https://discussions.apple.com/thread/3089948?start=0&tstart=0填上了解决scheme的其余部分&#x3002;

基本上在retrieve.php页面的底部,您需要使用类似于以下内容的行将浏览器redirect到一个目录: –

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

凡登记是一个目录 – 这然后调用DirectoryIndex(通常index.php),然后可以显示的东西给你的用户。

要填充$ paramsvariables,您需要在您的retrieve.php脚本的顶部有以下行

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

然后你可以parsing$ datastring来获得你所需要的(试试file_put_contents("data.txt", $data);或者Kyle2011的例子)

我还通过在Macterminal上使用udidgen ,而不是仅仅使用udidgen ,将Payload UDID更改为不同的东西。

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

请注意最后一页(FOLDER)。

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

你可以改变这个:

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

通过

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

来源: 在php.net手册上的标题function

是工作 !

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

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

作为参考,这里是我用来捕获数据的(非常)简单的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_DATAvariables来捕获发送的HTTP请求正文,而不是试图将其parsing为通常的名称/值对。 我build议在这一点上阅读文档 ,但它并没有告诉你很多。

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