本文基于在线安装Profile来实现获取UDID。

先看下效果,真机打开

获取设备UDID

科普

UDID
UDID (Unique Device Identifier),唯一标示符,是iOS设备的一个唯一识别码,每台iOS设备都有一个独一无二的编码,UDID其实也是在设备量产的时候,生成随机的UUID写入到iOS设备硬件或者某一块存储器中,所以变成了固定的完全不会改变的一个标识,用来区别每一个唯一的iOS设备,包括 iPhones, iPads, 以及 iPod touches

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

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

MDM
iOS支持企业级的MDM(Mobile Device Managment),也就是所谓的移动设备管理,目的就是让企业能够方便的管理 iPhone、Pad等移动设备。具体的做法是通过在系统中安装配置文件(Profiles)的方式实现各种功能,设备管理,设备安全,获取设备信息,设备配置,备份和恢复等几类功能,可以根据不同应用场景实现很多具体小功能。

Over-the-Air Profile Delivery and Configuration
一个配置的profile描述文件允许你基于iOS设备发布配置信息,如果你需要配置大量设备的邮件设置,网络设置,或者设备的证书,配置文件可以轻松完成。

iOS配置描述文件包含选多可以指定的设置,包括:

  • Passcode policies 密码策略
  • Restrictions on device features (disabling the camera, for example)
    设备特性限制(例如摄像头)
  • Wi-Fi settings WIFI设置
  • VPN settings VPN设置
  • Email server settings 邮件服务器设置
  • Exchange settings Exchange设置
  • LDAP directory service settings LDAP目录服务设置
  • CalDAV calendar service settings CalDAV日历服务设置
  • Web clips 桌面快捷方式
  • Credentials and keys 凭证和密钥
  • Advanced cellular network settings 高级蜂窝网络设置

一、通过苹果Safari浏览器获取iOS设备UDID步骤

苹果公司允许开发者通过iOS设备和Web服务器之间的某个操作(其实就是MDM的获取设备信息功能),来获得IOS设备的UDID(包括其他的一些参数)。以下为简要概述:

  1. 在你的Web服务器上创建一个.mobileconfig的XML格式的描述文件;
  2. 用户在所有操作之前必须通过某个点击操作完成.mobileconfig描述文件的安装;
  3. 服务器需要的数据,比如:UDID,需要在.mobileconfig描述文件中配置好,以及服务器接收数据的URL地址;
  4. 当用户设备完成数据的手机后,返回提示给客户端用户;

二、.mobileconifg

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

<!--参考: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>https://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仅仅是随机生成的唯一字符串,类似bundleid,一般是域名倒置,用来标识唯一。

iOS12 mobileconfig中的URL要用https地址(例如 https://dev.skyfox.org/udid/receive.php)。否者会报ATS错误。

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

服务器上的文件

当访问mobileconfig文件不能直接下载时,可能就需要设置mime content type了,application/x-apple-aspen-config

设置content type大体上两种方法

  1. 服务器容器设置

.htaccess增加如下配置

<IfModule mod_mime.c>AddType application/x-apple-aspen-config .mobileconfig
</IfModule>
  1. php等动态语言直接设置
header('Content-type: application/x-apple-aspen-config; chatset=utf-8');
header('Content-Disposition: attachment; filename="company.mobileconfig"');
echo $mobileconfig;

三、iOS设备安装.mobileconfig描述文件

新建一个用于下载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" /><meta 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><a class="buttons" href="yourapp://?function=valid&uuid=$udid">2.验证ipa</a></div>
</body>
</html>

//yourapp为应用提前设置的URL Schemes(查看自定义 URL Scheme 完全指南)

下面的界面就是用户通过浏览器点击开始安装时的界面,用户点击“Install/安装”开始安装,下面的mobileconfig文件是没有签名的,所以会显示“Unsigned/未签名”红色提示,并且安装的时候还会多出一部警告界面;点击查看:为iOS的mobileconfig文件进行签名

四、服务器接收返回数据并显示

设置好mobileconfig文件中的URL,并且下载安装mobileconfig之后,iOS设备会POST XML数据流给你的mobileconfig文件,PayloadContent节点中设置的URL。

以下是返回数据的格式

<!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 123456 7</string><key>PRODUCT</key><string>iPhone8,1</string><key>UDID</key><string>b59769e6c28b73b1195009d4b21cXXXXXXXXXXXX</string><key>VERSION</key><string>15B206</string></dict></plist>

使用xml等解析库解析数据后,直接把需要的UDID等设备信息传到显示页面即可(本文复用了index.php)。

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 = new StringBuilder();//读取HTTP请求内容String buffer = null;while ((buffer = br.readLine()) != null) {sb.append(buffer);}String content = sb.toString().substring(sb.toString().indexOf("<?xml"), sb.toString().indexOf("</plist>")+8);//content就是接收到的xml字符串//进行xml解析即可String 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文件页面}

index.php

<?php
$UDID =  $_GET['UDID'] ? $_GET['UDID'] : $_POST['UDID'];
?>UDID:<input style="width:300px;" name="" value="<?php echo $UDID;?>" />

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

the resource could not be loaded because the app transport security policy requires the use of a secure connection

如果iOS12 https还提示上述错误,可能是https证书tls版本不对,苹果要求tls1.2以上

demo源码: https://github.com/shaojiankui/iOS-UDID-Safari

  • PHP文件夹为使用PHP作为服务端获取UDID
  • JAVA文件夹为使用PHP作为服务端获取UDID
  • iOS-UDID-Safari-LocalServer文件夹为使用iOS内置服务器作为服务端获取UDID,有点小bug

官方Ruby完整实现
官方demo是官方文档上的示例代码,是完全按照开发流程图进行书写逻辑的,有需要的可以根据readme运行下看下效果。

https://github.com/shaojiankui/ios-profile-service

参考链接
Over-the-Air Profile Delivery and Configuration

Configuration-Profile-Reference.pdf

为iOS的mobileconfig文件进行签名

自定义 URL Scheme 完全指南

GUID 唯一字符串生成

iOS企业部署概述(官方文档)

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

https://discussions.apple.com/thread/3089948?start=0&tstart=0
转自:天狐博客 » 通过Safari浏览器获取iOS设备UDID(设备唯一标识符)

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

  1. 通过Safari浏览器获取iOS设备UDID(设备唯一标识符)

    通过Safari与mobileconfig获取iOS设备UDID(设备唯一标识符) 科普:U D I D (Unique Device Identifier),唯一标示符,是iOS设备的一个唯一识别码 ...

  2. 最全详解Android设备UDID还是唯一ID?

    这篇文章主要介绍了Android设备UDID还是唯一ID?我觉得挺不错的,现在分享给大家,也给大家做个参考. 我想为我的 Android应用程序生成android设备唯一ID,以根据用户设备udid创 ...

  3. Mac机获取IOS手机udid

    mac获取ios手机的udid 命令:idevice_id -l mac获取Android手机的udid 命令:adb deivces 查看 iOS 模拟器 udid命令: xcrun simctl ...

  4. iOS获取设备UDID/IMEI信息

    标题iOS获取设备UDID/IMEI信息 通过Safari与mobileconfig获取iOS设备UDID UDID (Unique Device Identifier),唯一标示符,是iOS设备的一 ...

  5. iOS系统 查看设备序列号 获取UDID

    iOS系统的设备标识即UDID,长度为40位,如:85f3c1bcb9ca8ad8b2931219072cf05382a6da09 获取UDID,可以使用手机端访问UDID查询网站在线查询,也可以通过 ...

  6. 如何获取iOS 设备的 UDID

    如何获取iOS 设备的 UDID UDID,是 iOS 设备的一个唯一识别码,每台 iOS 设备都有一个独一无二的编码,这个编码,我们称之为识别码,也叫做UDID( Unique Device Ide ...

  7. 查看UDID的两种方式,连手机查看,不用Mac连接iPhone手机,获取UDID, iOS 设备的一个唯一识别码

    什么是UDID? UDID,是 iOS 设备的一个唯一识别码,每台 iOS 设备都有一个独一无二的编码,这个编码,我们称之为识别码,也叫做UDID( Unique Device Identifier) ...

  8. 获取设备UDID等设备信息

    通过苹果Safari浏览器获取iOS设备UDID步骤 苹果公司允许开发者通过IOS设备和Web服务器之间的某个操作,来获得IOS设备的UDID(包括其他的一些参数).这里的一个概述: 1.在你的Web ...

  9. php获取ios,IOS 通过描述获取UDID PHP代码版

    难点在于PHP对XML的解析 文件结构: 第一步:新建HTML文件 用于跳转安装描述文件 必须在safari里面打开地址 第二步:新建udid.mobileconfig文件 PayloadConten ...

最新文章

  1. urllib使用cookies(下载,提取)
  2. python 线程类 threading.Thread.run() 方法
  3. SpringMVC的数据响应-回写数据
  4. cmd窗口设置charset
  5. [Bugku][Crypto][CTF][2020]Crypto 1-20 write up
  6. TensorFlow 中三种启动图用法
  7. mi max android 8.1,小米这款手机可以升级安卓 8.1 了!
  8. stl.find_if用法总结
  9. linux windows爆音,如何解决 Windows 服务器远程桌面的爆音问题
  10. SpringBoot与缓存使用及原理(上)
  11. 一体化伺服电机与施耐德PLC TM241CEC24T在Canopen协议下的应用
  12. jsmy97时间控件,时间范围选择
  13. linux乌班图做服务器,使用 Ubuntu 16.04 搭建全能服务器
  14. BLE(1)—— 简介
  15. 能被2,3,4,5,6,7,8,9...等数整除的数特征
  16. 互联网架构概述 互联网架构演变过程
  17. Quartus2_13.0初级使用教程
  18. Spring Security : 概念模型 SecurityContext 安全上下文
  19. 显示纯服务器_涨爆!纯32元/小时,干到年底轻松25000,唤醒钱包吧!
  20. 电子商务(B2C)购物网站需求设计方案

热门文章

  1. .Net加密与解密——非对称加密之数字签名
  2. Django计算机毕业设计母婴商品店进出货管理系统python(源码程序+lw+远程部署)
  3. 【物联网】27.物联网开发 - 网络
  4. Log4j 日志配置邮件实战
  5. js递归树形结构去掉不符合条件的
  6. 【PROTEUS仿真】使用AT89C51控制AD0809进行采样并显示
  7. VHDL 计数器实验看VHDL语言
  8. Arduino开发遥控小车(三)基于nRF24L01无线模块实现舵机转向和直流电机调速
  9. python函数测验题_python函数练习题
  10. MEET2022智能未来大会今日举行,李开复张亚勤上演巅峰对话