使用Java Servlet从移动Safari获取iPhone的UDID和IMEI

5

我希望能够通过移动Safari获取iPhone的UDID。我正在使用.mobileconfig

<plist version="1.0">
    <dict>
        <key>PayloadContent</key>
        <dict>
            <key>URL</key>
            <string>http://192.168.12.45:8080/enroll/retrieve</string>
            <key>DeviceAttributes</key>
            <array>
                <string>UDID</string>
                <string>SERIAL</string>
                <string>CHALLENGE</string>
                <string>IMEI</string>
                <string>ICCID</string>
                <string>VERSION</string>
                <string>PRODUCT</string>
                <string>DEVICE_NAME</string>
                <string>MAC_ADDRESS_EN0</string>
            </array>
        </dict>
        <key>PayloadOrganization</key>
        <string>Org</string>
        <key>PayloadDisplayName</key>
        <string>Profile Service</string>
        <key>PayloadVersion</key>
        <integer>1</integer>
        <key>PayloadUUID</key>
        <string>D6F1B2A3-0039-48B5-915B-8E2B35663816</string>
        <key>PayloadIdentifier</key>
        <string>Identifer</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>

retrieve.php

<?php
  $data = file_get_contents('php://input');
  header('Location: http://192.168.12.45/enroll/info?'.$data, true, 301);
?>

“info”是一个目录而不是页面,在该目录下我创建了index.php文件,我可以通过$_GET获取数据。

但是我无法通过Java Servlet获取数据。

我已经在mobileconfig文件中更改了Servlet URL,但是我无法从Java中获取任何值。

检索Java代码

    Enumeration headerNames = request.getHeaderNames();
    while (headerNames.hasMoreElements()) {
        String paramName = (String) headerNames.nextElement();
        String paramValue = request.getHeader(paramName);
        System.out.println("paramValue :" + paramValue);
    }

输出:

paramValue :192.168.12.45:8080
paramValue :keep-alive
paramValue :gzip, deflate
paramValue :Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D201 Safari/9537.53
paramValue :en-us
paramValue :text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

出现了如下错误

enter image description here

然而我想要用Java Servlet获取IMEI。 我想将上述PHP代码更改为Java Servlet。 如何解决并安装简档以获取UDID和IMEI。


该链接显示:特别注意:: 唯一成功的方法是将重定向发送到一个目录。我已尝试将其重定向到 .aspx 页面,但失败了。如果你没有做对,用户将会看到一个模糊的错误信息,并会被卡住。 你是将重定向发送到目录了吗? - MysticMagicϡ
那个链接显示出现错误。 - MysticMagicϡ
我也不是。只是提一下,以防你错过了。抱歉! - MysticMagicϡ
2个回答

3
由于您的数据库文件或包含它的目录启用了加密,这可能是造成问题的原因。 请使用以下方法:

NSFileManager的setAttributes:ofItemAtPath:error:并使用NSFileProtectionNone


0

看起来你想使用Java Servlet而不是PHP。 根据this article, 这可能行不通, 因为在你的.mobileconfig文件中指定的接收URL似乎必须是一个PHP文件:

警告:出于某种原因,该过程对服务器响应发送用户到预设URL的方式非常苛刻。尝试多次后,我相信您的接收URL必须是一个.php文件。这听起来很疯狂,但我是认真的。

但你仍然可以尝试。 根据this post, 这个Java代码应该大致等同于PHP的php://input, 将其放入你的servlet中:

    InputStream stream = request.getInputStream();
    byte[] buffer = new byte[512];
    StringBuilder builder = new StringBuilder();
    while (stream.read(buffer) != -1) {
        builder.append(new String(buffer));
    }
    System.out.println(builder);

如果仍然不起作用,我想你别无选择,只能像文章作者一样使用 PHP 来进行重定向至 Servlet。在这种情况下,在 retrieve.php 中更改 '/info?'.$data'/info?data='.$data,将 $data 作为命名查询参数传递,会更好一些。
<?php
  $data = file_get_contents('php://input');
  header('Location: http://192.168.12.45/enroll/info?data='.rawurlencode($data));
?>

我还把$datarawurlencode($data)包装了起来,并且删除了那些似乎不必要的额外参数。

然后在你的servlet中,你可以这样访问data参数:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    String data = request.getParameter("data");
    System.out.println(data);
}

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