天天看点

通过Safari与mobileconfig获取iOS设备UDID(设备唯一标识符)

科普:udid 是由子母和数字组成的40个字符串的序号,用来区别每一个唯一的ios设备,包括 iphones, ipads, 以及 ipod touches

随着苹果对程序内获取udid封杀的越来越严格,私有api已经获取不到udid,mac地址等信息,继而出现了使用钥匙串配合uuid等等方法变相实现

由于近期项目需求是设备授权的形式使用软件,使用钥匙串等方法不完全能解决问题,因为重置或重做系统都会清除uuid然后重新存入,所以想到了用safari的方式获取设备真实的udid

<a target="_blank" href="http://dev.skyfox.org/udid/">获取设备udid</a>

苹果公司允许开发者通过ios设备和web服务器之间的某个操作,来获得ios设备的udid(包括其他的一些参数)。这里的一个概述:

1、在你的web服务器上创建一个.mobileconfig的xml格式的描述文件;

2、用户在所有操作之前必须通过某个点击操作完成.mobileconfig描述文件的安装;

3、服务器需要的数据,比如:udid,需要在.mobileconfig描述文件中配置好,以及服务器接收数据的url地址;

4、当用户设备完成数据的手机后,返回提示给客户端用户;

在这篇文章中,主要讲如何获得标识符。其实还可以获取更多信息,以下是一个获得udid示例.mobileconfig配置

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

&lt;!--参考:https://developer.apple.com/library/ios/documentation/networkinginternet/conceptual/iphoneotaconfiguration/configurationprofileexamples/configurationprofileexamples.html--&gt;

&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;!doctype plist public "-//apple//dtd plist 1.0//en" "http://www.apple.com/dtds/propertylist-1.0.dtd"&gt;

&lt;plist version="1.0"&gt;

    &lt;dict&gt;

        &lt;key&gt;payloadcontent&lt;/key&gt;

        &lt;dict&gt;

            &lt;key&gt;url&lt;/key&gt;

            &lt;string&gt;http://dev.skyfox.org/udid/receive.php&lt;/string&gt; &lt;!--接收数据的接口地址--&gt;

            &lt;key&gt;deviceattributes&lt;/key&gt;

            &lt;array&gt;

                &lt;string&gt;udid&lt;/string&gt;

                &lt;string&gt;imei&lt;/string&gt;

                &lt;string&gt;iccid&lt;/string&gt;

                &lt;string&gt;version&lt;/string&gt;

                &lt;string&gt;product&lt;/string&gt;

            &lt;/array&gt;

        &lt;/dict&gt;

        &lt;key&gt;payloadorganization&lt;/key&gt;

        &lt;string&gt;dev.skyfox.org&lt;/string&gt;  &lt;!--组织名称--&gt;

        &lt;key&gt;payloaddisplayname&lt;/key&gt;

        &lt;string&gt;查询设备udid&lt;/string&gt;  &lt;!--安装时显示的标题--&gt;

        &lt;key&gt;payloadversion&lt;/key&gt;

        &lt;integer&gt;1&lt;/integer&gt;

        &lt;key&gt;payloaduuid&lt;/key&gt;

        &lt;string&gt;3c4dc7d2-e475-3375-489c-0bb8d737a653&lt;/string&gt;  &lt;!--自己随机填写的唯一字符串--&gt;

        &lt;key&gt;payloadidentifier&lt;/key&gt;

        &lt;string&gt;dev.skyfox.profile-service&lt;/string&gt;

        &lt;key&gt;payloaddescription&lt;/key&gt;

        &lt;string&gt;本文件仅用来获取设备id&lt;/string&gt;   &lt;!--描述--&gt;

        &lt;key&gt;payloadtype&lt;/key&gt;

        &lt;string&gt;profile service&lt;/string&gt;

    &lt;/dict&gt;

&lt;/plist&gt;

你需要填写回调数据的url和payloaduuid。该payloaduuid仅仅是随机生成的唯一字符串,用来标识唯一

注意:mobileconfig下载时设置文件内容类型content type为:application/x-apple-aspen-config

新建一个用于下载mobileconfig的网页,这里我命名为udid.php

&lt;!doctype

html&gt;

&lt;html

xmlns="http://www.w3.org/1999/xhtml"&gt;

&lt;head&gt;

&lt;meta

http-equiv="content-type"

content="text/html;

charset=utf-8"

/&gt;

content="width=device-width,

initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0,user-scalable=no"

name="viewport"

id="viewport"

&lt;title&gt;获取您的udid&lt;/title&gt;

&lt;body&gt;

&lt;div

id="content"&gt;

uudi:&lt;input

style=""

name=""

value="$udid"

&lt;a

class="buttons"

href="udid.mobileconfig"

target="_blank"&gt;1.点击获取您的udid&lt;/a&gt;

href="yourapp://?function=valid&amp;uuid=$udid"&gt;2.验证ipa&lt;/a&gt;

&lt;/div&gt;

&lt;/body&gt;

&lt;/html&gt;

通过Safari与mobileconfig获取iOS设备UDID(设备唯一标识符)

设置好mobileconfig文件中的url,并且下载安装mobileconfig之后,ios设备会post  xml数据流给你的url

receive.php

&lt;?php

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

//这里可以进行xml解析

//header("location: http://dev.skyfox.org/udid?data=".rawurlencode($data)); //有人说必须得目录形式才会安装成功

header('http/1.1 301 moved permanently');  //这里一定要301跳转,否则设备安装会提示"无效的描述文件"

header("location: http://dev.skyfox.org/udid/index.php?".$params);

?&gt;

java版本receive.do

protected

void

dopost(httpservletrequest

request,

httpservletresponse

response)

throws

servletexception,

ioexception

{

    response.setcontenttype("text/html;charset=utf-8");

    request.setcharacterencoding("utf-8");

    //获取http请求的输入流

    inputstream

is

=

request.getinputstream();

    //已http请求输入流建立一个bufferedreader对象

    bufferedreader

br

new

bufferedreader(new

inputstreamreader(is,"utf-8"));

    stringbuilder

sb

stringbuilder();

    //读取http请求内容

    string

buffer

null;

    while

((buffer

br.readline())

!=

null)

sb.append(buffer);

    }

&amp;nbsp;&amp;nbsp;&amp;nbsp;

string

content

sb.tostring().substring(sb.tostring().indexof("&lt;?xml"),

sb.tostring().indexof("&lt;/plist&gt;")+8);

    //content就是接收到的xml字符串

    //进行xml解析即可

udid

    response.setstatus(301);

//301之后ios设备会自动打开safari浏览器

    response.setheader("location",

"http://192.168.1.106:8080/udid.jsp?udid="+udid);

    //http://192.168.1.106:8080/udid.jsp

是用于显示udid的页面,也可以利用之前的下载mobileprofile文件页面

}

值得注意的是重定向一定要使用301重定向,有些重定向默认是302重定向,这样就会导致安装失败,设备安装会提示"无效的描述文件

objective-c

    &lt;!doctype

plist

public

"-//apple//dtd plist 1.0//en"

"http://www.apple.com/dtds/propertylist-1.0.dtd"&gt;

    &lt;plist

version="1.0"&gt;

      &lt;dict&gt;

        &lt;key&gt;imei&lt;/key&gt;

        &lt;string&gt;12

123456

7&lt;/string&gt;

        &lt;key&gt;product&lt;/key&gt;

        &lt;string&gt;iphone8,1&lt;/string&gt;

        &lt;key&gt;udid&lt;/key&gt;

        &lt;string&gt;b59769e6c28b73b1195009d4b21cxxxxxxxxxxxx&lt;/string&gt;

        &lt;key&gt;version&lt;/key&gt;

        &lt;string&gt;15b206&lt;/string&gt;

      &lt;/dict&gt;

    &lt;/plist&gt;

<a target="_blank" href="http://www.skyfox.org/ios-mobileconfig-sign.html">点击查看:为ios的mobileconfig文件进行签名</a>

参考链接:

http://www.joshwright.com/tips/getting-an-iphone-udid-from-mobile-safari

https://discussions.apple.com/thread/3089948?start=0&amp;tstart=0