资讯专栏INFORMATION COLUMN

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

ZoomQuiet / 746人阅读

摘要:因为新浪服务器升级,限制目录和文件名的长度,所以更换实现方式简介平台发布应用,想绕过,最好的方式就是发布了由于越狱用户覆盖不全,一般不考虑越狱方式。

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

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

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

出错原因:

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

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

没有条件部署HTTPS服务器

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

安装页面引入这个JS

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

点击安装

参数说明

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

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



  
  
  
  
  APP测试
  
  


  
⚠️注意!以下安装包仅用于测试!
点击我安装
如果你想完全自己提供这些,请看下面的内容。 实现原理

我曾经为了解决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文件内容,将拼接好的内容当文件返回。

ipa;
    $icon = $obj->icon;
    $ident = $obj->ident;
    $version = $obj->version;
    $title = $obj->title;

$data =
"


items


assets


kind
software-package
url
".$ipa."


kind
display-image
needs-shine

url
".$icon."


metadata

bundle-identifier
".$ident."
bundle-version
".$version."
kind
software
title
".$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
利用GithubHTTPS服务部署:http://my.oschina.net/qixiaobo025/blog/321050

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/15746.html

相关文章

  • AHJCDN:备案CDN,香港/美国GIA高速节点CND价格,无视DDOS/CC攻击的CDN

    摘要:目前,提供免备案免备案,香港美国高速节点价格,无视攻击的。推荐阅读香港美国免备案无视攻击的高速节点提供免费套餐香港美国免备案无视攻击的高速节点提供免费套餐怎么样致力于打造一个企业级的云平台,提供场景化服务。ahjcdn怎么样?ahjcdn致力于打造一个企业级的云平台,提供场景化SaaS/PaaS服务。目前,AHJCDN提供免备案CDN,香港/美国GIA高速节点CND价格,无视DDOS/CC攻...

    番茄西红柿 评论0 收藏2637
  • AHJCDN:备案CDN,无视DDOS/CC攻击的CDN,香港/美国GIA高速节点,提供费套餐

    摘要:通过专业的技术和业内领先的可靠服务为用户的业务持续增长提供助力,现除了在香港当地拥有两大高规格数据中心,而且业务已拓展至美国新加坡台湾日本韩国等地,同时商家也提供国内的服务,域名自动过白,网站经常受到攻击的朋友可以入手。AHJCDN致力于打造一个企业级的云平台,提供场景化SaaS/PaaS服务。通过专业的技术和业内领先的可靠服务为用户的业务持续增长提供助力, AHJCDN现除了在香港 当地拥...

    maochunguang 评论0 收藏0
  • 网络安全人员必考的几本证书

    摘要:注册信息安全专业人员应急响应工程师考证费用信息安全相关专业高校生有意向从事应急响应工作的人员正在从事应急响应工作者无学历和工作经验的强制要求,通过考试即可获得中国信息安全测评中心颁发的注册应急响应工程师证书。 ...

    qianfeng 评论0 收藏0
  • Rancher发布K3s!史上轻量K8s发行,赋能边缘计算

    摘要:史上最轻量的开源发行版来了满足在边缘计算和设备上的新兴使用场景。此次发布的项目,将满足在边缘计算环境中运行在和处理器上的小型易于管理的集群日益增长的需求。 史上最轻量的开源Kubernetes发行版——K3s来了!满足Kubernetes在边缘计算和IoT设备上的新兴使用场景。 showImg(https://segmentfault.com/img/remote/1460000018...

    kohoh_ 评论0 收藏0
  • AHJCDN:备案CDN,无视DDOS/CC攻击的CDN,香港/美国GIA高速节点,提供费套餐

    摘要:通过专业的技术和业内领先的可靠服务为用户的业务持续增长提供助力,现除了在香港当地拥有两大高规格数据中心,而且业务已拓展至美国新加坡台湾标签日本下的日志日本韩国等地,同时商家也提供国内的服务,域名自动过白,网站经常受到攻击的朋友可以入手。AHJCDN致力于打造一个企业级的云平台,提供场景化SaaS/PaaS服务。通过专业的技术和业内领先的可靠服务为用户的业务持续增长提供助力, AHJCDN现除...

    light 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<