⚠️因为新浪服务器升级,限制目录和文件名的长度,所以更换实现方式

简介

iOS平台发布应用,想绕过AppStore,最好的方式就是In-House发布了(由于越狱用户覆盖不全,一般不考虑越狱方式)。
网上搜索In-House的教程也很多,怎么申请企业证书,怎么对ipa包进行大包签名我就不再复述,文章最后附了两个链接,不了解的童鞋可以看一看。

如果有做过In-House部署,应该知道,需要准备一个描述应用信息的*.plist文件上传到服务器,并且从iOS7及以后版本,此文件必须部署在HTTPS服务器上才能正常安装。这一步非常容易出错不能成功部署。

出错原因:

  • 签名错误或者打包方式不对。

  • 是因为对配置文件不了解,出错了也不知道错在哪里。

  • 没有条件部署HTTPS服务器

最简单的方式(上传ipa包到http服务器,调用一个js方法)

  • 安装页面引入这个JS

<script src="http://iosinstall.sinaapp.com/plist/ios-install.js"></script>
  • 在安装按钮的位置调用openInstallURL方法,可以使用任意HTML标签!

<div onclick="openInstallURL({'title'   : '我是App标题','ipa'     : 'http://www.xxx.com/app.ipa', 'version' : '1.0','ident'   : 'cn.xxx.xxx', 'icon'    : ''});">点击安装</div>
  • 参数说明

参数 说明 备注
title 标题 Safari弹出安装提示时提示的标题
ipa 你猜 ipa包需要你上传到自己的服务器上,然后将可以下载到这个ipa包的URL填写到这里,可以使用HTTP协议!
version 你再猜 ⚠️iOS9以后,必须跟ipa包上的版本号对应,否则安装到最后会提示失败
ident App唯一标识符 你可以在项目配置的Bundle Identifier下看到他
icon 安装加载过程中的图标 如果传入空字符串,会有一个默认图标:

Demo

  • 对HTML不熟悉的同学可以直接用下面的代码,样式已经写好了,将其保存成*.html文件即可

<html>
<head><meta name="generator" content="HTML Tidy for Mac OS X (vers 31 October 2006 - Apple Inc. build 15.12), see www.w3.org" /><meta charset="utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>APP测试</title><link rel="stylesheet" href="http://iosinstall.sinaapp.com/plist/ios-install.css"><script src="http://iosinstall.sinaapp.com/plist/ios-install.js"></script>
</head>
<body><h5 style="text-align: center; color: red; padding: 20px;">⚠️注意!以下安装包仅用于测试!<br/></h5><install-btn onclick="openInstallURL({'title'     : '我是标题', 'ipa'     : 'http://www.xxx.com/ipa/xxxx.ipa', 'version'    : '1.0','ident'   : 'com.xxx.xxx', 'icon'    : ''});">点击我安装</install-btn>
</body>
</html>

如果你想完全自己提供这些,请看下面的内容。

实现原理

我曾经为了解决In-House部署问题,也走了很多弯路,为了解决HTTPS的问题,使用私有证书,利用Dropbox的HTTPS服务,又或是使用Github的HTTPS服务,这些方式都是可行的,但是都有不同程度的麻烦,于是有了今天这个帖子。

实现逻辑:客户端根据自己的软件需求,传参到服务器,服务器动态生成*.plist,因为iOS会检测*.plist的URL,不能带有参数,所以将参数用Base64加密后加到URL路径中,服务器截取路径中的参数部分解密获得参数。由于路径变化的特殊性,需要配置好服务器的重定向。
这样,就不需要每个新的应用都去配置一次*.plist文件了!
我现在提供的动态*.plist运行在新浪云稳定快速,可以放心使用!

  • js实现的逻辑:收集参数,将参数加密成Base64字符串,插入到访问URL里面。

// http://iosinstall.sinaapp.com/plist/ios-install.js
var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var base64DecodeChars = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,-1,  0,  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, -1, -1, -1, -1, -1,-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);// Base64编码的方法
function base64encode(str) {var out, i, len;var c1, c2, c3;len = str.length;i = 0;out = "";while(i < len) {c1 = str.charCodeAt(i++) & 0xff;if(i == len) {out += base64EncodeChars.charAt(c1 >> 2);out += base64EncodeChars.charAt((c1 & 0x3) << 4);out += "==";break;}c2 = str.charCodeAt(i++);if(i == len) {out += base64EncodeChars.charAt(c1 >> 2);out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));out += base64EncodeChars.charAt((c2 & 0xF) << 2);out += "=";break;}c3 = str.charCodeAt(i++);out += base64EncodeChars.charAt(c1 >> 2);out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));out += base64EncodeChars.charAt(c3 & 0x3F);}return out;
}// 计算hash值
var I64BIT_TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-'.split('');
function hash(input){var hash = 5381;var i = input.length - 1;if(typeof input == 'string'){for (; i > -1; i--)hash += (hash << 5) + input.charCodeAt(i);}else{for (; i > -1; i--)hash += (hash << 5) + input[i];}var value = hash & 0x7FFFFFFF;var retValue = '';do{retValue += I64BIT_TABLE[value & 0x3F];}while(value >>= 6);return retValue;
}/**Demo:var info = {    'title'        : '我是标题', // app name 'ipa'        : 'http://www.xxx.com/ipa/xxx.ipa', // ipa url 'version'    : '1.0','ident'        : 'cn.xxx.xxx', 'icon'        : '' // icon url};openInstallURL(info);*/
function openInstallURL(info) {if (info.ident == null || info.ident.length == 0) {info.ident = 'cn.ineva.cn';}if (info.icon == null || info.icon.length == 0) {info.icon = 'http://iosinstall.sinaapp.com/plist/ios-install.png';}if (info.version == null || info.version.length == 0) {info.version = '1.0.0';}var json = JSON.stringify(info)var base64String = base64encode(encodeURI(json)).replace(/\=/g, "");var fileName = hash(base64String)var s = 128;var count = Math.ceil( base64String.length / s);var path = "";// 因为新浪对链接文件名和目录的长度有限制,json数据,使用`/`分隔for (var i = 0; i < count; i++) {var l = s;if (i == count - 1) {l = base64String.length - i * s;}path += "/" + base64String.substr( i * s, l);}var url = 'https://iosinstall.sinaapp.com/plist' + path + "/" + fileName + ".plist";window.self.location = 'itms-services://?action=download-manifest&url=' + url;
}
  • 服务器PHP实现:从URL中截获参数,使用参数拼接好*.plist文件内容,将拼接好的内容当文件返回。

<?php$pathItems = explode('/', $_SERVER["REQUEST_URI"]);if ( count($pathItems) < 4 ) {return;}$base64Data = "";$fileName = "ios-install.plist";for ( $i = 2; $i < count($pathItems); $i++ ){if ( $i == count($pathItems) - 1 ) {$fileName = $pathItems[$i];} else {$base64Data .= $pathItems[$i];}}$jsonString = urldecode(base64_decode($base64Data));$obj = json_decode($jsonString);$ipa = $obj->ipa;$icon = $obj->icon;$ident = $obj->ident;$version = $obj->version;$title = $obj->title;$data =
'<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>items</key>
<array>
<dict>
<key>assets</key>
<array>
<dict>
<key>kind</key>
<string>software-package</string>
<key>url</key>
<string>'.$ipa.'</string>
</dict>
<dict>
<key>kind</key>
<string>display-image</string>
<key>needs-shine</key>
<true/>
<key>url</key>
<string>'.$icon.'</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>'.$ident.'</string>
<key>bundle-version</key>
<string>'.$version.'</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>'.$title.'</string>
</dict>
</dict>
</array>
</dict>
</plist>';$file_size = strlen($data);ob_clean();header("Content-type:application/octet-stream");header("Server:nginx/1.4.4");header("Content-type:text/plain");header("Accept-Ranges:bytes");header("Accept-Length:".$file_size);header("Content-Disposition: attachment; filename=".$fileName);echo $data;

其他方式发布(适合开源项目)

我开发的一个看韩国漫画的项目,使用手机上的Safari打开链接就可以安装:http://qzs21.github.io/iComic/
有兴趣的话可以看看这个项目,代码和安装包发布部署都是使用Github(master分支下面是项目代码,gh-pages分支就是安装页面的代码): https://github.com/qzs21/iComic

相关推荐

非常详尽的In-House部署教程:http://blog.csdn.net/yangxt/article/details/7998762
利用GithubHTTPS服务部署:
http://my.oschina.net/qixiaobo025/blog/321050

最简单企业证书部署应用!In-House改进版!免HTTPS!相关推荐

  1. 在线培训系统搭建,简单成熟的部署方式,助力企业拥有培训平台

    现代企业中,由于员工工作节奏加快.人员层次复杂多样,因此具体的培训也总是遇到顾此失彼的情况,而市场中能够使用进行培训的产品和合服务也很多,企业在选择实际培训平台时也面临很多不确定性,这些问题给企业组织 ...

  2. 用ios企业证书发布ipa到服务器上扫码下载

    这段时间公司需要做一个ios的app,用的是mui框架,在HBuilder中发行为原生的安装包,用的ios企业证书.我从ipa包生成之后说起. ipa包生成之后,就到了下载这一步了,因为是企业证书,上 ...

  3. 企业云部署要如何选择IaaS PaaS和SaaS

    1为什么IaaS成了灵丹妙药 我非常惊讶,为什么很多传统企业已经接受了云计算,但接受的方式却往往不尽人意.对大多数企业来说,云计算的投入产出比相对较小,并且局限于基础设施层的环节. 就目前而言,大多数 ...

  4. 菜鸟学exchange之一:exchange邮件系统的简单安装和部署

    菜鸟学exchange之一:exchange邮件系统的简单安装和部署 2009-05-10 23:15:34 实验背景: 西安凌云高科技是一家拥有300名员工的高新技术企业,总部在位于西安.在上海和北 ...

  5. Windows Phone 8 企业应用部署指南(二)

    之前WindowsPhone 8企业应用部署指南(一)介绍了如何将企业级应用在企业内部部署发布.其中作为企业内部部署和发布应用的根本前提是获得企业移动代码签名证书.本节介绍从Symantec申请企业移 ...

  6. 苹果企业证书_IOS福利9月15日苹果企业证书已更新!重新下载即可!

    (视频素材来源于网上) 支持系统:苹果 上一期你可能错过的:全网短视频免费去水印,还支持解析VIP影视! 最近众号修改推送的机制,请大家一定要把公众号:玩转网络科技,设置成"星标⭐" ...

  7. Windows 10企业批量部署实战之刷新并添加启动映像

    相关组件及配置都设置完成后,接下来我们需要对我们的控制台进行刷新操作,以便生成windows PE启动映像并添加到WDS启动映像完成Windows 10企业部署的最后操作.针对x64\x86两启动映像 ...

  8. 导入csv未响应_IOS免费P12企业证书分享!支持导入Gbox和闪电签!Windows和Mac通用!...

    软件介绍: 软件名称:P12企业证书(共享证书) 适用平台:win/mac/ios签名工具 P12企业证书 证书最近失效的比较快,都知道是做什么的用的,不做过多的介绍,简单来说就是给企业应用app签名 ...

  9. Exchange Server 2013系列四:小企业邮件系统部署

    2019独角兽企业重金招聘Python工程师标准>>> Exchange Server 2013 SP1 系列四:小企业部署邮件服务器 杜飞 Exchange 服务器功能强大,不再只 ...

最新文章

  1. 基于Sharding Sphere实现数据“一键脱敏”
  2. spring与springBoot不同之处
  3. python 图像计算方位角
  4. vscode卸载background插件_使用插件一键启用 Visual Studio Code 的毛玻璃效果
  5. mybatis配置文件不在resources目录下时需进行的额外配置方法
  6. 自己整理的css3动画库,附下载链接
  7. 五步法”判断自媒体创作好与坏的标准
  8. html哪个标签显示第一节,HTML第一节
  9. 企业级工作流解决方案(七)--微服务Tcp消息传输模型之消息编解码
  10. springboot的war部署到tomcat正常启动,访问404问题
  11. 安卓模拟器安装教程_雷电安卓模拟器v4.0.38绿色免安装版——墨涩网
  12. PostgreSQL/pgsql数据库优化查询和索引的猜想
  13. 互联网人年底加薪指南
  14. 开源天气时钟项目删减和更新
  15. Oracle官网登录账号
  16. Clickhouse 字符串函数
  17. elasticsearch启动报错:FileAlreadyExistsException:/home/es/elasticsearch-6.3.0/configelasticsearch.keysto
  18. 咖啡豆是怎么生产出来的
  19. weblogic打补丁方法
  20. 【来日复制粘贴】用高级筛选和函数公式拆分数据列表

热门文章

  1. SecureCRT连接Linux显示Mysql记录中文乱码
  2. Perl程序设计中常用的函数
  3. csharp datagridview to a datatable,a dataset
  4. linux中如何批量修改文件名
  5. memsql 多节点部署
  6. CAAnimation KeyPath学习总结
  7. 原来你是这样的JAVA[01]-基础一瞥
  8. PHP用socket连接SMTP服务器发送邮件
  9. Owin的URL编码怎么搞?以前都是HttpUtility.UrlEncode之类的,现在连system.web都没了,肿么办?...
  10. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记30 ScrollView Demo实战