相信很多人尝试过使用揣果测试库(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地址