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

简介

iOS平台发布应用,想绕过AppStore,最好的方式就是In-House发布了(由于越狱用户覆盖不全,一般不考虑越狱方式)。

网上搜索In-House的教程也很多,怎么申请企业证书,怎么对ipa包进行大包签名我就不再复述,文章最后附了两个链接,不了解的童鞋可以看一看。

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

出错原因:

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

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

没有条件部署HTTPS服务器

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


安装页面引入这个JS

在安装按钮的位置调用openInstallURL方法,可以使用任意HTML标签!

'title'  : '我是App标题',

'ipa'    : 'http://www.xxx.com/app.ipa',

'version' : '1.0',

'ident'  : 'cn.xxx.xxx',

'icon'    : ''});">点击安装

参数说明

参数说明备注

title标题Safari弹出安装提示时提示的标题

ipa你猜ipa包需要你上传到自己的服务器上,然后将可以下载到这个ipa包的URL填写到这里,可以使用HTTP协议!

version你再猜⚠️iOS9以后,必须跟ipa包上的版本号对应,否则安装到最后会提示失败

identApp唯一标识符你可以在项目配置的Bundle Identifier下看到他

icon安装加载过程中的图标如果传入空字符串,会有一个默认图标:

Demo

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

APP测试⚠️注意!以下安装包仅用于测试!

'title'    : '我是标题',

'ipa'    : 'http://www.xxx.com/ipa/xxxx.ipa',

'version'    : '1.0',

'ident'  : 'com.xxx.xxx',

'icon'    : ''});">点击我安装

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

实现原理

我曾经为了解决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.jsvarbase64EncodeChars ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";varbase64DecodeChars =newArray(    -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编码的方法functionbase64encode(str){varout, i, len;varc1, 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);    }returnout;}// 计算hash值varI64BIT_TABLE ='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-'.split('');functionhash(input){varhash =5381;vari = input.length -1;if(typeofinput =='string'){for(; i > -1; i--)   hash += (hash <<5) + input.charCodeAt(i); }else{for(; i > -1; i--)   hash += (hash <<5) + input[i]; }varvalue= hash &0x7FFFFFFF;varretValue ='';do{  retValue += I64BIT_TABLE[value&0x3F]; }while(value>>=6);returnretValue;}/**

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);

*/functionopenInstallURL(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';    }varjson = JSON.stringify(info)varbase64String = base64encode(encodeURI(json)).replace(/\=/g,"");varfileName = hash(base64String)vars =128;varcount = Math.ceil( base64String.length / s);varpath ="";// 因为新浪对链接文件名和目录的长度有限制,json数据,使用`/`分隔for(vari =0; i < count; i++) {varl = s;if(i == count -1) {            l = base64String.length - i * s;        }        path +="/"+ base64String.substr( i * s, l);    }varurl ='https://iosinstall.sinaapp.com/plist'+ path +"/"+ fileName +".plist";    window.self.location ='itms-services://?action=download-manifest&url='+ url;}

服务器PHP实现:从URL中截获参数,使用参数拼接好*.plist文件内容,将拼接好的内容当文件返回。

ipa;$icon=$obj->icon;$ident=$obj->ident;$version=$obj->version;$title=$obj->title;$data='itemsassetskindsoftware-packageurl'.$ipa.'kinddisplay-imageneeds-shineurl'.$icon.'metadatabundle-identifier'.$ident.'bundle-version'.$version.'kindsoftwaretitle'.$title.'';        $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

利用Github的HTTPS服务部署:http://my.oschina.net/qixiaobo025/blog/321050

推荐阅读更多精彩内容