最简单企业证书部署应用!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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容