标签:
相信很多人尝试过使用揣果测试库(http://ipa.chuaiguo.com/)的无线安装测试IPA安装包功能。有心人一定注意到其itms-services协议的一键安装地址的url=部分并不是我们常见的plist文件路径,而是一个install.php通过增加参数的形式自动生成输出了plist。之前因为笔者的项目中渠道包不多,所以懒得去写这样一个文件帮助部署,可是最近,笔者的项目的渠道包不断增多了,显然部署多个plist文件管理上似乎越来越麻烦了,于是笔者开始仿照揣果实现了并结合自己项目的需求,实现了PHP动态生成 iOS渠道包IPA一键安装之plist。这里跟大家分享一下,希望对您有所帮助。
<!--** * index.html * iOS渠道包一键安装跳转页面。 * Created by pcjbird on 2015-05-28 * Copyright (c) 2015年 Zero Status. All rights reserved. *--> <html> <head> <title>iOS 一键安装</title> <meta http-equiv="Content-Type" content="text/HTML; charset=utf-8"> <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport" /> <script type="text/javascript"> function doLocation(url) { var a = document.createElement("a"); if(!a.click) { window.location = url; return; } a.setAttribute("href", url); a.style.display = "none"; document.body.appendChild(a); a.click(); } function getQueryString(str) { var rs=new RegExp("(^|)"+str+"=([^&]*)(&|$)","gi").exec(locString),tmp; if(tmp=rs)return tmp[2]; return ""; } </script> </head> <body> 下载中... <script type="text/javascript"> var locString=String(window.document.location.href); var cid = getQueryString(‘cid‘); var sslServer = ‘https://www.lessney.com/‘; var mainChannelId = 2; var curVersionName = ‘1.0.3‘; if (!cid) { cid = mainChannelId; } doLocation(‘itms-services://?action=download-manifest&url=‘ + encodeURIComponent(sslServer + ‘install.php?v=‘ + curVersionName + ‘&cid=‘ + cid)); </script> </body> </html>
<?php /** * install.php * PLIST文件生成器,用于iOS渠道包一键安装。 * Created by pcjbird on 2015-05-28 * Copyright (c) 2015年 Zero Status. All rights reserved. */ //判断是否为字典数组(dict) function isDict($array) { return (is_array($array) && 0 !== count(array_diff_key($array, array_keys(array_keys($array))))); } //向xml节点中写入字典数组(dict) function xmlWriteDict(XMLWriter $x, &$dict) { $x->startElement(‘dict‘); foreach($dict as $k => &$v) { $x->writeElement(‘key‘, $k); xmlWriteValue($x, $v); } $x->endElement(); } //向xml节点中写入数组(array) function xmlWriteArray(XMLWriter $x, &$arr) { $x->startElement(‘array‘); foreach($arr as &$v) xmlWriteValue($x, $v); $x->endElement(); } //根据类型向xml节点中写入值 function xmlWriteValue(XMLWriter $x, &$v) { if (is_int($v) || is_long($v)) $x->writeElement(‘integer‘, $v); elseif (is_float($v) || is_real($v) || is_double($v)) $x->writeElement(‘real‘, $v); elseif (is_string($v)) $x->writeElement(‘string‘, $v); elseif (is_bool($v)) $x->writeElement($v?‘true‘:‘false‘); elseif (isDict($v)) xmlWriteDict($x, $v); elseif (is_array($v)) xmlWriteArray($x, $v); else { trigger_error("Unsupported data type in plist ($v)", E_USER_WARNING); $x->writeElement(‘string‘, $v); } } //创建plist function createplist() { $ssl_server = ‘https://www.lessney.com/‘; $target_name = ‘Sample‘; $bundle_identifier = ‘com.lessney.‘ . $target_name; $subtitle = ‘Zero Status Inc.‘; $title = ‘示例程序‘; $versionname = $_GET[‘v‘]; if (!$versionname) { $versionname = ‘1.0.0‘; } $versioncode = str_replace(‘.‘, ‘‘, $versionname); $channelid = $_GET[‘cid‘]; if (!$channelid) { $channelid = ‘0‘; } header(‘Content-Type: application/xml‘); $plist = new XmlWriter(); $plist->openMemory(); $plist->setIndent(TRUE); $plist->startDocument(‘1.0‘, ‘UTF-8‘); $plist->writeDTD(‘plist‘, ‘-//Apple//DTD PLIST 1.0//EN‘, ‘http://www.apple.com/DTDs/PropertyList-1.0.dtd‘); $plist->startElement(‘plist‘); $plist->writeAttribute(‘version‘, ‘1.0‘); $pkg = array(); $pkg[‘kind‘] = ‘software-package‘; $pkg[‘url‘] = $ssl_server . $target_name .‘_v‘ . $versioncode . ‘_‘ .$channelid . ‘.ipa‘; $displayimage = array(); $displayimage[‘kind‘] = ‘display-image‘; $displayimage[‘needs-shine‘] = TRUE; $displayimage[‘url‘] = $ssl_server . ‘Icon.png‘; $fullsizeimage = array(); $fullsizeimage[‘kind‘] = ‘full-size-image‘; $fullsizeimage[‘needs-shine‘] = TRUE; $fullsizeimage[‘url‘] = $ssl_server . ‘iTunesArtwork.png‘; $assets = array(); $assets[] = $pkg; $assets[] = $displayimage; $assets[] = $fullsizeimage; $metadata = array(); $metadata[‘bundle-identifier‘] = $bundle_identifier; $metadata[‘bundle-version‘] = $versionname; $metadata[‘kind‘] = ‘software‘; $metadata[‘subtitle‘] = $subtitle; $metadata[‘title‘] = $title; $items0 = array(); $items0[‘assets‘] = $assets; $items0[‘metadata‘] = $metadata; $items = array(); $items[] = $items0; $root = array(); $root[‘items‘] = $items; xmlWriteValue($plist, $root); $plist->endElement(); $plist->endDocument(); return $plist->outputMemory(); } //输出plist echo createplist(); ?>
转载请注明:Zero Status ? itms-services协议:跳转网页部署及PHP动态生成 iOS渠道包IPA一键安装之plist地址
itms-services协议:跳转网页部署及PHP动态生成 iOS渠道包IPA一键安装之plist
标签:
原文地址:http://my.oschina.net/pcjbird/blog/486444