从Mobile Safari获取iPhone UDID和IMEI使用java servlet

时间:2014-12-11 11:42:10

标签: java ios iphone servlets mobile-safari

我希望通过Mobile Safari获得iPhone UDID。我在用 .mobileconifg as

<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中获取了数据。

但我能从php获得。

但是我想使用java servlet,我在servlet url上的mobileconfig文件中更改了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。 如何解决这个问题并安装Profile以获取UDID和IMEI

2 个答案:

答案 0 :(得分:3)

这可能是由于您的数据库文件或包含它的目录启用了加密。 使用:

带有NSFileManager's setAttributes:ofItemAtPath:error:

NSFileProtectionNone

答案 1 :(得分:0)

所以你似乎想要使用Java servlet而不是PHP。 根据{{​​3}}, 这可能不起作用, 因为.mobileconfig文件中指定的接收URL似乎必须是 PHP文件:

  

QUIRK警告:无论出于何种原因,该过程非常特别关注服务器在将用户发送到您的预设URL时的响应方式。经过多次尝试,我相信您的接收URL必须是.php文件。这听起来很疯狂,但我很认真。

但你还是可以试试。 根据{{​​3}}, 这个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中,会更好 您需要将$data作为命名查询参数传递, 将'/info?'.$data更改为'/info?data='.$data,如下所示:

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

我还在$data中包裹了rawurlencode($data),并删除了似乎没有必要的额外参数。

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

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