iOS开发企业版ipa分发(In-House模式)记录

前言

本人公司开发的.ipa发布于 AppStore 和自己的服务器上。但是自己却一直没时间利用公司的资源进行研究。现在赶紧趁热打铁,记录一下,以便以后查阅。

在此之前,在网上查阅了相关资料并整理了一下加以完善更正。

背景

网上说Xcode 6之后版本导出企业.ipa包需要手动添加.plist文件,本人今天亲自测试了一遍,发现Xcode 7之后又可以配置生成的。在这里我按照我的流程走一遍。

IPA打包

  1. 在工程中选择Product-Archive进入打包界面
  2. 选择Export进入打包方式选择界面
  3. 选择Save for Enterprise Deployment选项,Next
    打包方式
  4. 选择对应的企业账号,然后继续即可


    选择开发者账号
  5. 接下来是对安装设备的要求选择,默认选择所有设备。第二个选项是指定特定类型设备方可安装。我们使用默认第一项,Next
    安装设备要求
  6. 之后的界面是对应用的二次确认,确保APP配置准确无误。在窗口的左下方有一个Include manifest for over-the-air installation。该选项表示是否在生成.ipa文件的同时生成.plist文件,我们勾选上,Next
    确认配置

    over-the-air: OTA 是苹果在iOS4中新增的一项功能,目的是让企业用户能够在脱离Apple App Store的情况下通过网页无线发布 iOS 应用;简单来讲就是在Safari中点击一个链接就可以在iPhone或iPad上下载并安装应用(目前很多越狱软件都是使用的这种发布方式)。

  7. 接下来配置.plist文件,填写完之后,Export导出.ipa包和相应的.plist文件(建议将生成的.plist文件命名同APP名一致,方面后期管理)
    配置plist文件

构建网站

必备条件

  • 需要购买一个苹果的企业版证书,价格$299/年。指南

  • 网站需要支持HTTPS协议,用于访问下载.plist文件

    这里有两种办法:

    • 一种是购买SSL证书或者免费申请SSL证书
    • 另一种是将.plist文件托管在第三方上面,利用第三方支持的HTTPS进行访问下载;

使用OSChina的代码托管。访问OSChina,添加一个项目;然后用git或svn客户端将.plist文件提交到版本库中;最后在浏览器中访问项目中的.plist文件,查看原始数据,即可获得plist的https下载地址。

步骤

1.将.plist文件与.ipa文件上传至服务器供用户访问
2.创建一个包含如下代码的网页,用户轻点 Web 链接后会下载.plist文件,并触发下载和安装。

<a href="itms-services://?action=download-manifest&url=https://example.com/manifest.plist">Install App</a>

3.配置服务器MIME类型
您可能需要配置 Web 服务器,让.plist文件和.ipa文件可正确传输。

对于OS X Server,请将MIME类型添加到 Web 服务的MIME类型设置:

  • application/octet-stream ipa
  • text/xml plist

对于微软的互联网信息服务器 (IIS),请使用IIS Manager在服务器的“属性”页面中添加MIME类型:

  • .ipa application/octet-stream
  • .plist text/xml

【警告】撤销分发证书会导致使用该证书签名的所有应用失效。只有万不得已时才应撤销证书,比如确定专用密钥已丢失或确信证书已遭破解。


拓展区

关于无线清单文件(.plist文件)

清单文件是一个XML plist 文件,可供 Apple 设备用来从您的 Web 服务器上查找、下载和安装应用。清单文件由 Xcode 创建,使用的是您在共享用于企业分发的归档应用时所提供的信息。
以下栏是必填项:

  • URL应用 (.ipa) 文件的完全限定 HTTPS URL
  • display-image57 x 57 像素的 PNG 图像,在下载和安装过程中显示。指定图像的完全限定 URL
  • full-size-image512 x 512 像素的 PNG 图像,表示 iTunes 中相应的应用
  • bundle-identifier应用的包标识符,与 Xcode 项目中指定的完全一样
  • bundle-version应用的包版本,在 Xcode 项目中指定
  • title下载和安装过程中显示的应用的名称

样本清单文件(下面给出)还包含可选键。例如,如果应用文件太大,并且想要在执行错误检验(TCP 通信通常会执行该检验)的基础上确保下载的完整性,可以使用 MD5 键。
通过指定项目数组的附加成员,您可以使用一个清单文件安装多个应用。

示例 iOS 应用清单文件

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <!-- array of downloads.-->
  <key>items</key>
  <array>
   <dict>
    <!-- an array of assets to download -->
     <key>assets</key>
      <array>
       <!-- software-package: the ipa to install.-->
        <dict>
         <!-- required. the asset kind.-->
          <key>kind</key>
          <string>software-package</string>
          <!-- optional. md5 every n bytes. will restart a chunk if md5 fails.-->
          <key>md5-size</key>
          <integer>10485760</integer>
          <!-- optional. array of md5 hashes for each "md5-size" sized chunk.-->
          <key>md5s</key>
          <array>
            <string>41fa64bb7a7cae5a46bfb45821ac8bba</string>
            <string>51fa64bb7a7cae5a46bfb45821ac8bba</string>
          </array>
          <!-- required. the URL of the file to download.-->
          <key>url</key>
          <string>https://www.example.com/apps/foo.ipa</string>
        </dict>
        <!-- display-image: the icon to display during download.-->
        <dict>
         <key>kind</key>
         <string>display-image</string>
         <!-- optional. indicates if icon needs shine effect applied.-->
         <key>needs-shine</key>
         <true/>
         <key>url</key>
         <string>https://www.example.com/image.57x57.png</string>
        </dict>
        <!-- full-size-image: the large 512x512 icon used by iTunes.-->
        <dict>
         <key>kind</key>
         <string>full-size-image</string>
         <!-- optional. one md5 hash for the entire file.-->
         <key>md5</key>
         <string>61fa64bb7a7cae5a46bfb45821ac8bba</string>
         <key>needs-shine</key>
         <true/>
         <key>url</key><string>https://www.example.com/image.512x512.jpg</string>
        </dict>
      </array>
<key>metadata</key>
      <dict>
       <!-- required -->
       <key>bundle-identifier</key>
       <string>com.example.fooapp</string>
       <!-- optional (software only) -->
       <key>bundle-version</key>
       <string>1.0</string>
       <!-- required. the download kind.-->
       <key>kind</key>
       <string>software</string>
       <!-- optional. displayed during download; typically company name -->
       <key>subtitle</key>
       <string>Apple</string>
       <!-- required. the title to display during the download.-->
       <key>title</key>
       <string>Example Corporate App</string>
      </dict>
    </dict>
  </array>
</dict>
</plist>

苹果官方相关文档
以无线方式安装企业内部应用

关于正确提取.plist文件下载地址姿势

在评论区中,有朋友问及到关于.plist文件的下载地址不正确问题,这里提供几种方式:

1、在自己的服务器部署.plist时,直接提供服务器下载地址即可
2、将.plist文件部署在github上时,可以在进入.plist详细界面,点击RAW按钮获取正确的地址

raw

真实地址

3、另外七牛也是一个不错的选择,我们可以将.plist文件上传到七牛上面,需要配置ssl证书。

部署下载页面方式

1、方式一:进入下载页面之后点击安装APP按钮之后才能下载安装

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
    <head>
        <metahttp-equiv="Content-Type"content="text/html; charset=utf-8"/>
        <title>应用名字</title>
    </head>
    <body>
        <h1style="font-size:80pt">如果点击无法下载安装,请复制超链接到浏览器中打开<h1/>
        <h1style="font-size:100pt">
        <a title="iPhone" href="itms-services://?action=download-manifest&url=https://example.com/manifest.plist">安装APP</a><h1/>
    </body>
</html>

2、方式二:进入下载页面之后自动下载安装

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
    <head>
        <metahttp-equiv="Content-Type"content="text/html; charset=utf-8"/>
        <title>应用名字</title>
        <script>
            var url ="https://example.com/manifest.plist";
            window.location ="itms-services://?action=download-manifest&url="+ url;
        </script>
    </head>
    <body>
    </body>
</html>

3、方式三:通过iOS应用内安装

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-services://?action=download-manifest&url=https://example.com/manifest.plist"]];

4、方式四:终极大招,直接使用第三方托管平台(推荐两个自己常用平台)

  1. fir.im - 免费应用内测托管平台|iOS应用Beta测试分发|Android应用内测分发
  2. 蒲公英 - 免费的应用托管平台|App应用众测分发
  3. TestFlight Beta Testing - App Store - Apple Developer

安装失败原因

利用企业证书打包部署的 ipa 安装有可能存在安装失败的情况。一般的失败的原因可以查阅iOS应用安装失败原因排查


再一次感谢您花费时间阅读这篇文章!

微博: @Danny_吕昌辉
博客: SuperDanny

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

推荐阅读更多精彩内容