科普: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
<!--参考:https://developer.apple.com/library/ios/documentation/networkinginternet/conceptual/iphoneotaconfiguration/configurationprofileexamples/configurationprofileexamples.html-->
<?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://dev.skyfox.org/udid/receive.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>dev.skyfox.org</string> <!--组织名称-->
<key>payloaddisplayname</key>
<string>查询设备udid</string> <!--安装时显示的标题-->
<key>payloadversion</key>
<integer>1</integer>
<key>payloaduuid</key>
<string>3c4dc7d2-e475-3375-489c-0bb8d737a653</string> <!--自己随机填写的唯一字符串-->
<key>payloadidentifier</key>
<string>dev.skyfox.profile-service</string>
<key>payloaddescription</key>
<string>本文件仅用来获取设备id</string> <!--描述-->
<key>payloadtype</key>
<string>profile service</string>
</dict>
</plist>
你需要填写回调数据的url和payloaduuid。该payloaduuid仅仅是随机生成的唯一字符串,用来标识唯一
注意:mobileconfig下载时设置文件内容类型content type为:application/x-apple-aspen-config
新建一个用于下载mobileconfig的网页,这里我命名为udid.php
<!doctype
html>
<html
xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta
http-equiv="content-type"
content="text/html;
charset=utf-8"
/>
content="width=device-width,
initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0,user-scalable=no"
name="viewport"
id="viewport"
<title>获取您的udid</title>
<body>
<div
id="content">
uudi:<input
style=""
name=""
value="$udid"
<a
class="buttons"
href="udid.mobileconfig"
target="_blank">1.点击获取您的udid</a>
href="yourapp://?function=valid&uuid=$udid">2.验证ipa</a>
</div>
</body>
</html>
设置好mobileconfig文件中的url,并且下载安装mobileconfig之后,ios设备会post xml数据流给你的url
receive.php
<?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);
?>
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);
}
&nbsp;&nbsp;&nbsp;
string
content
sb.tostring().substring(sb.tostring().indexof("<?xml"),
sb.tostring().indexof("</plist>")+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
<!doctype
plist
public
"-//apple//dtd plist 1.0//en"
"http://www.apple.com/dtds/propertylist-1.0.dtd">
<plist
version="1.0">
<dict>
<key>imei</key>
<string>12
123456
7</string>
<key>product</key>
<string>iphone8,1</string>
<key>udid</key>
<string>b59769e6c28b73b1195009d4b21cxxxxxxxxxxxx</string>
<key>version</key>
<string>15b206</string>
</dict>
</plist>
<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&tstart=0