苹果ios通过描述文件获取udid
苹果ios通过描述文件获取udid
需要准备的东西
1,安装描述文件只支持https的回调地址,所以需要申请https域名
2,描述文件签名,不安装也可,只要能接受红色的字
步骤:
1,准备xml文件
<?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://caipudq.cn/home/ajax/getuid</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>www.xman.com</string>
        <key>PayloadDisplayName</key>
        <string>caipu</string>
        <key>PayloadVersion</key>
        <integer>1</integer>
        <key>PayloadUUID</key>
        <string>abc66063-61b1-4348-ac01-d815a073ff5e</string>
        <key>PayloadIdentifier</key>
        <string>com.yun-bangshou.profile-service</string>
        <key>PayloadDescription</key>
        <string>该配置文件将帮助用户获取当前iOS设备的UDID号码。</string>
        <key>PayloadType</key>
        <string>Profile Service</string>
    </dict>
</plist>
2,生成xml文件逻辑
此版本是生成文件直接下载的版本
$path = WEB_ROOT .'static/mobileconfig.xml';
		$pathto = WEB_ROOT .'static/udid.mobileconfig';
		$url = config('API_HOSTS').'/user/getudid/?uid='.$uid;//config('API_HOST').'/user/getudid/uid/'.$uid;
		changexml_fun($path,$url,$pathto);
		//Atom  
		header('Content-type: application/x-apple-aspen-config'); 
		//header("Accept-Ranges:bytes");
		//header("Accept-Length:" . filesize($pathto));
		//header("Content-Disposition:attachment;filename=udid.mobileconfig");
		//@readfile($pathto);
		$mobileconfig = file_get_contents($pathto);
		//echo $mobileconfig;
		header('location:'.config('API_HOST').'static/udid.mobileconfig');
如果是读取则需要加
header('Content-type: application/x-apple-aspen-config; chatset=utf-8');
header('Content-Disposition: attachment; filename="company.mobileconfig"');
echo $mobileconfig;
3,回调地址的写法
回调地址只是中间跳转,苹果会从这里的301跳转到浏览器,所以安装完描述文件默认是会跳到浏览器里,在代码最后要进行301跳转。
    	$uid = $this->request->param('uid');
    	$data = file_get_contents('php://input');
		$plistBegin   = '<?xml version="1.0"';
		$plistEnd   = '</plist>';
		
		$pos1 = strpos($data, $plistBegin);
		$pos2 = strpos($data, $plistEnd);
		
		$data2 = substr ($data,$pos1,$pos2-$pos1);
		
		$xml = xml_parser_create();
		
		xml_parse_into_struct($xml, $data2, $vs);
		xml_parser_free($xml);
		
		$UDID = "";
		$CHALLENGE = "";
		$DEVICE_NAME = "";
		$DEVICE_PRODUCT = "";
		$DEVICE_VERSION = "";
		$iterator = 0;
		
		$arrayCleaned = array();
		
		foreach($vs as $v){
		
		    if($v['level'] == 3 && $v['type'] == 'complete'){
		    $arrayCleaned[]= $v;
		    }
		$iterator++;
		}
		
		$data = "";
		
		$iterator = 0;
		
		foreach($arrayCleaned as $elem){
		                $data .= "\n==".$elem['tag']." -> ".$elem['value']."<br/>";
		                switch ($elem['value']) {
		                    case "CHALLENGE":
		                        $CHALLENGE = $arrayCleaned[$iterator+1]['value'];
		                        break;
		                    case "DEVICE_NAME":
		                        $DEVICE_NAME = $arrayCleaned[$iterator+1]['value'];
		                        break;
		                    case "PRODUCT":
		                        $DEVICE_PRODUCT = $arrayCleaned[$iterator+1]['value'];
		                        break;
		                    case "UDID":
		                        $UDID = $arrayCleaned[$iterator+1]['value'];
		                        break;
		                    case "VERSION":
		                        $DEVICE_VERSION = $arrayCleaned[$iterator+1]['value'];
		                        break;                       
		                    }
		                    $iterator++;
		}
		
		$params = "uid=".$uid."&UDID=".$UDID."&CHALLENGE=".$CHALLENGE."&DEVICE_NAME=".$DEVICE_NAME."&DEVICE_PRODUCT=".$DEVICE_PRODUCT."&DEVICE_VERSION=".$DEVICE_VERSION;
$dataaa['text']=$params;
		db::table('mk_test')->insert($dataaa);
		//echo db::table('mk_test')->getlastsql();
		// enrollment is a directory
		header('HTTP/1.1 301 Moved Permanently');
		header('Location:'.config('API_HOSTS').'user/saveudid/?'.($params),TRUE,301);
		exit;
这里一定要注意:
重定向一定要使用301重定向,有些重定向默认是302重定向,这样就会导致安装失败,设备安装会提示"无效的描述文件
4,最终处理udid
$uid = $this->request->param('uid');
    	$udid = $this->request->param('UDID');
//todo处理获取到的udid
苹果ios通过描述文件获取udid的更多相关文章
- iOS开发:创建真机调试证书及描述文件
		iOS开发:创建真机调试证书及描述文件 关于苹果iOS开发,笔者也是从小白过来的,经历过各种困难和坑,其中就有关于开发证书,生产证书,in_house证书,add_Hoc证书申请过程中的问题,以及上架 ... 
- iOS开发 - 超级签名实现之描述文件
		简介 因为最近企业签掉得太严重了,上头要求实现超级签进行游戏下载.故有了此文章,记录一下过程. 签名原理其实很简单,超级签名的技术就是使用个人开发者账号,将用户的设备当作开发设备进行应用分发.这也导致 ... 
- 苹果证书p12和描述文件的创建方法
		在2020年之前,我们在使用香蕉云编创建苹果证书的时候,只需要注册苹果开发者账号,但不需要缴费成为开发者. 在2020年之后,需要先缴费成为苹果开发者. 假如你还没有注册苹果开发者账号,可以先参考下下 ... 
- 通过安装一个描述文件在控制台获得设备的udid
		在我的这篇博客里面说明了本地获得设备udid的方法,但是只能在模拟器中获得http://www.cnblogs.com/liyy2015/p/6090204.html 当然可以在设备上集成苹果的MDM ... 
- iOS证书和描述文件
		iOS有两种证书和描述文件: 证书类型 使用场景 开发(Development)证书和描述文件 用于开发测试,在HBuilder中打包后可在真机环境通过Safari调试 发布(Distribution ... 
- 真机测试---iOS证书(.p12)和描述文件(.mobileprovision)
		iOS证书和描述文件: 证书类型 使用场景 开发(Development)证书和描述文件 用于开发测试,在starain中打包后可在真机环境通过Safari调试 发布(Distribution)证书和 ... 
- iOS证书(.p12)和描述文件(.mobileprovision)申请
		证书类型 使用场景 开发(Development)证书和描述文件 用于开发测试,在HBuilder中打包后可在真机环境通过Safari调试 发布(Distribution)证书和描述文件 用于提交Ap ... 
- [转]iOS证书(.p12)和描述文件(.mobileprovision)申请
		转载于:http://ask.dcloud.net.cn/article/152 iOS有两种证书和描述文件: 证书类型 使用场景 开发(Development)证书和描述文件 用于开发测试,在HBu ... 
- 【Abode Air程序开发】iOS证书(.p12)和描述文件(.mobileprovision)申请
		iOS证书(.p12)和描述文件(.mobileprovision)申请 5+App开发 Apple证书 iOS证书 iOS有两种证书和描述文件: 证书类型 使用场景 开发(Development)证 ... 
随机推荐
- Java版流媒体编解码和图像处理(JavaCPP+FFmpeg)
			欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ... 
- 热身训练4 Article
			Article 在这个学期即将结束时,DRD开始写他的最后一篇文章. DRD使用著名的Macrohard的软件World来写他的文章. 不幸的是,这个软件相当不稳定,它总是崩溃. DRD需要在他的文章 ... 
- 记录编译QGIS(3.4+Qt5.11+VS2015)的整个过程
			编译运行整个QGIS耗时耗力,由于本人比较愚钝,来来回回花了大概两个星期最终编译成功,记录一下整个过程,一方面备忘,另一方面可能也给别人一点借鉴. 1.准备工作 参考了许多网上的教程,李民录大神的&l ... 
- Linux入门需要搞清楚的思路问题
			很多同学接触linux不多,对linux平台的开发更是一无所知. 而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机it行业从业人员,="" 掌握linux是一种很重要的 ... 
- Spring---IoC(控制反转)原理学习笔记【全】
			1.IoC创建对象的方式 使用无参构造创建对象 假如要使用有参构造创建: 下标赋值constructor-arg <!--有参--> <bean id="User" ... 
- cf17B Hierarchy(额,,,水)
			题意: Nick's company employed n people. Now Nick needs to build a tree hierarchy of «supervisor-surbod ... 
- clnt_create: RPC: Port mapper failure - Unable to receive: errno 111 (Connection refused)
			clnt_create: RPC: Port mapper failure - Unable to receive: errno 111 (Connection refused) 关闭防火墙,可以连, ... 
- 记录一个很傻的错误(C++)
			使用的vscode写代码,导入了vector,memory,然后忘了导入string.但是代码中能够提示std::string也就让我忘了导入string.然后就莫名其妙的报错了.找了很久的错.记录下 ... 
- Linux常用命令和快捷键整理:(1)常用命令
			前言: Linux常用快捷键和基本命令整理,先上思维导图: 1.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录.文件夹.文件权限) ... 
- 了解php数据库常用语法增删改查
			数据库基本语法 MySQL增:insert into 表名 (字段1,...,字段n) values (值1,...,值n) MySQL删:delete from 表名 where 条件 MySQL改 ... 
