企业应用部署在iOS 7.1上无法正常工作。

319
我们使用企业账号通过 itms-services:// URL 分发应用。这一直很正常,但在我们的 iPad 上安装了 iOS 7.1 beta 后,它拒绝安装。相反,我们只得到 iOS 在任何下载问题时无用地显示的通用信息Cannot connect to example.com
我无法在这里、Google 或 7.1 发布说明中找到任何东西来表明可能会引起问题的原因。

1
这是否还包括 Mavericks Server 中的构建服务器? - Dan
我们的OS X服务器也出现了这个问题。 - toofah
也许这会有所帮助:http://www.teratotech.com/blog/hhb-ios-tips-send-enterprise-app-distribution/ - HelmiB
16个回答

330
我通过将iPad连接到电脑并在尝试安装应用程序时通过XCode Organizer查看控制台,找到了问题。错误信息如下:

无法加载非 HTTPS 的清单 URL:http://example.com/manifest.plist

结果发现,在iOS 7.1中,manifest.plist文件的URL必须使用HTTPS,而我们使用的是HTTP。将URL更改为HTTPS即可解决问题。
即:
itms-services://?action=download-manifest&url=http://example.com/manifest.plist

变成

itms-services://?action=download-manifest&url=https://example.com/manifest.plist

我认为你需要拥有一个与此域名相关的有效SSL证书。我们已经拥有了,但如果没有它,我想你可能会遇到问题。


5
您可以为您的网站创建自签名SSL证书,不要忘记使用iPhone配置实用程序创建配置文件,以使该证书在您的设备上得到信任。 - Niralp
1
@SantaClaus 你检查过 "itms-services://" 链接是否包含 https:// 而不是 http:// 吗?另外,请确认你的 plist 文件中也包含了 HTTPS 的 IPA Url。 - Niralp
3
我和@Niralp一样遇到了同样的问题。我使用自签名的SSL证书设置了我们的Apache服务器。服务器似乎可以正常使用SSL,但是OTA链接仍然无法工作并显示上述错误。我在iOS设备上安装了证书,但也没有任何改变。你有什么想法吗? - toofah
5
我创建了自己的证书颁发机构,并用它签署了 Web 服务器 SSL 证书。通过 Apple Configurator,您可以创建一个配置文件,将该 CA 标记为可信。之后安装将按预期进行。 - Monobono
1
值得注意的是,manifest.plist文件中包含的URL不需要使用HTTPS。只有ITMS URL需要使用HTTPS。 - Brody Robertson
显示剩余11条评论

235

ingconti是正确的。

  1. 将您的app.plist上传到Dropbox。
  2. 获取app.plist的共享链接,例如https://www.dropbox.com/s/qgknrfngaxazm38/app.plist
  3. 在链接中使用dl.dropboxusercontent.com替换www.dropbox.com,例如https://dl.dropboxusercontent.com/s/qgknrfngaxazm38/app.plist
  4. 删除Dropbox可共享链接上的任何参数,例如“?dl=0t”(根据Carlos Aguirre Tradeco在Enterprise app deployment doesn't work on iOS 7.1和我自己的经验)。
  5. 创建一个名为download.html的文件,并使用以下格式的链接:<a href="itms-services://?action=download-manifest&url=https://dl.dropboxusercontent.com/s/qgknrfngaxazm38/app.plist">INSTALL!!</a>
  6. 将您的download.html上传到Dropbox
  7. 再次获取download.html的共享链接,例如https://www.dropbox.com/s/gnoctp7n9g0l3hx/download.html,并删除任何参数。
  8. 在第二个链接中也使用dl.dropboxusercontent.com替换www.dropbox.com,例如https://dl.dropboxusercontent.com/s/gnoctp7n9g0l3hx/download.html

现在,在您的设备上访问https://dl.dropboxusercontent.com/s/gnoctp7n9g0l3hx/download.html,您可以像以前一样安装应用程序。

多么美妙的世界!


4
这救了我的命!谢谢,谢谢,谢谢! - bentford
13
谢谢...我是苹果的忠实粉丝,但最近开始讨厌它了...因为这些愚蠢的东西浪费了我的时间... - Karthik
1
我完成了上述所有步骤。我遇到了和DanM一样的问题。下载开始后几秒钟,就会出现“无法在此时下载...”的警告。 - alper_k
2
我明白了。之前我把文件保存在我的私人文件夹里,现在我把它们改到公共文件夹里了。别忘了把文件放到公共文件夹里。祝好,老人。 - Hariprasad.J
显示剩余22条评论

72

除了Mark Parnell的回答,一个快速且不太正式的解决方法是将清单plist放入Dropbox中,然后使用Dropbox Web界面获取直接https链接(“分享链接”->“获取链接”->“下载”)。

实际的ipa文件可以保留在您一直提供服务的地方。在将其插入到itms-servivces URL的查询中之前,您需要对plist的URL进行URL编码(尽管只是将任何&s替换为%3D可能会起作用)。

缺点之一是安装对话框现在将显示“dl.dropbox.com想要安装[whatever]”。


1
我制作了一个工具来帮助这个问题:http://otter-ota.herokuapp.com。它会自动调整您的Dropbox共享URL,生成一个plist(因为Xcode不再这样做?),并创建所需的itms链接和HTML。如果需要,它还可以托管着陆页面。 - Soup

35

确实,从iOS7.1开始,您需要通过https进行所有OTA部署。苹果没有记录这一点,真可耻。

如果您正在寻找比依赖dropbox或花费现金购买证书更好的内部解决方案,那么只需按照此处提示#5中概述的步骤即可获得解决方案:http://blog.httpwatch.com/2013/12/12/five-tips-for-using-self-signed-ssl-certificates-with-ios/

其要点如下:

  • 创建自己的CA Authority证书并在设备上完全信任它(我通过电子邮件安装了它)
  • 根据根证书创建密钥/证书对并将其安装在您的服务器上
  • 确保您的Web服务器使用与CA Authority根证书匹配的密钥/证书对
  • 此时,您应该能够像往常一样通过https安装应用程序
  • 可以使用已默认安装的openssl在OSX上完成所有这些操作

这不同于仅执行自签名证书,在此解决方案中,您还充当自己的私人证书颁发机构。如果您在Apple设备上安装的根证书没有标记为受信任(绿色),则出现问题。重新执行。

这绝对奏效。

更新:3/13/2014 - 我提供了一个小型命令行实用程序,可简化整个过程。您可以在此处获取它:https://github.com/deckarep/EasyCert/releases


1
非常好。感谢您的总结和CL工具。 - Alex Zavatone
我刚花了一个小时才搞明白这一点。使用8192位密钥作为您的CA证书将失败。iOS将导入您的证书,但出于某种原因不会信任它。4096位的CA密钥可以正常工作。 - EmeraldD.
1
@EmeraldD。在https://github.com/deckarep/EasyCert/blob/master/EasyCert.go的代码中没有使用8192位密钥。实际上,该工具使用与文章演示相同的2048位密钥。很抱歉让您浪费了时间。 - Ralph Caraveo
@ZhaoXiang 我可以考虑添加这个功能。您能否在此处提交一个问题:https://github.com/deckarep/easycert/issues,并尽可能发布您用于转换所有文件所需的所有命令。 - Ralph Caraveo
@nath,我已经检查了你的链接,我认为他们是使用MMC而不是IIS添加cers。我正在使用IIS 7,并且通过在IIS的“服务器证书”部分中使用“导入”来添加cers,使用“操作”面板。 - Zhao Xiang
1
这是实际的答案,伙计们,+1 :)) - Tech_Intelliswift

33
我遇到了同样的问题,虽然我已经在使用SSL服务器,但仅仅将链接更改为https并不能解决根本问题。
那个突出显示的部分告诉我,我们应该有选择信任证书的选项,但由于这是应用商店,在Safari中工作时,恢复建议并没有被呈现出来。 enter image description here 点击此处查看图片
我对现有解决方案不满意,因为:
  • 一些选项需要依赖第三方(Dropbox)
  • 我们不愿意为SSL证书付费
    • 免费的SSL证书只是一个临时解决方案。

最终,我通过创建一个自签名根证书授权并使用它生成我们服务器的SSL证书找到了一个解决方案。

我使用了Keychain Access和OSX Server,但每个步骤都有其他有效的解决方案。


创建证书颁发机构

据我了解,证书颁发机构用于验证证书的真实性。由于我们即将自己创建一个,它并不是非常安全,但这意味着您可以信任来自特定机构的所有证书。这些机构的列表通常默认包含在您的浏览器中,因为它们是实际受信任的。(如GeoTrust Global CA、Verisign等)

  • 打开钥匙串并使用证书助手创建一个机构

enter image description here

  • 填写您的证书颁发机构信息

enter image description here

  • 我不知道是否必要,但我已经将权限设为可信任。

enter image description here


生成证书签名请求

在我们的情况下,证书签名请求是由服务器管理员生成的。简单来说,它是一个文件,询问“我能否使用这些信息为我的站点获取证书”。

  • 接下来,您需要创建证书签名请求(我使用OSX服务器的证书管理器完成此步骤)

enter image description here

  • 填写您的证书信息(必须只包含ASCII字符!感谢@Jasper Blues)

enter image description here

  • 将生成的CSR保存在某处

enter image description here


创建证书

作为证书颁发机构,您需要判断发送CSR的人是否真实可靠,而不是冒充别人。真正的机构有自己的验证方式,但由于您很有把握是您自己,所以您的验证应该是相当确定的 :)

  • 返回到钥匙串访问并打开“创建证书”选项,如下所示

enter image description here

  • 将保存的CSR拖到指定的框中

enter image description here

点击“让我覆盖此请求的默认设置”按钮。

enter image description here

  • 我喜欢增加有效期。

enter image description here

由于某些原因,我们需要再次填写一些信息。

enter image description here

  • 在此屏幕上点击“继续”

enter image description here

  • 确保您点击SSL服务器身份验证,这个让我遇到了一些麻烦。

enter image description here

  • 您可以点击继续浏览其他选项。

  • 邮件应用程序将打开,让您有机会发送证书。而不是通过电子邮件发送,请右键单击并保存它。

enter image description here


安装证书

现在我们需要设置服务器使用刚刚创建的证书来处理SSL流量。

  • 如果您正在使用的设备是服务器,则可能已经安装了证书。

enter image description here

如果没有安装证书,双击待处理的证书并将我们刚从电子邮件中保存的PEM文件拖到指定的位置。(或者,如果您没有保存它,可以从钥匙串中导出PEM。)

enter image description here

  • 更新您的服务器以使用这个新证书。如果发现新证书无法“固定”并且不断恢复,请返回到粗斜体大写字母中的部分。

enter image description here


设备设置

您需要在每个需要安装应用程序的设备上安装此证书颁发机构的副本,以便它们知道可以信任该颁发机构颁发的SSL证书。

  • 返回到钥匙串访问并将您的证书颁发机构导出为.cer文件。

enter image description here

我将此文件与OTA应用程序一起放在服务器上,用户可以单击此链接并下载授权证书。将证书直接发送电子邮件给用户也是有效的选项。

enter image description here

  • 在您的设备上安装证书。

enter image description here


测试

  • 确保您的plist链接是https

    • 尝试安装应用程序!现在应该可以工作了。证书颁发机构是受信任的,并且SSL证书来自该机构。

我不太理解你回答的最后一部分,这是否意味着我必须将 .cer 文件放在我的服务器上,用户应该通过 HTTP 下载 .cer 文件,然后才能通过 HTTPS 安装 ipa 文件?我的理解正确吗? - Zhao Xiang
1
我已经使用易于使用的命令行工具完全自动化了这个过程,只需要两个参数即可。请参阅我的答案:github.com/deckarep/EasyCert/releases。 - Ralph Caraveo
我正在使用Windows Server上的IIS,我生成了一个.cer文件并将其放在我的iPhone上,但它仍然无法工作,不知道为什么。我想现在宁愿花一些钱来获得认证。 - Zhao Xiang
好的,我意识到问题出在哪里了。应该安装在设备上的cer文件是CA证书,而不是站点证书。 - Zhao Xiang
1
请注意,必须安装在设备上的证书是“证书颁发机构”证书,而不是我最初错误安装的自签名SSL证书。 - NSTJ
显示剩余5条评论

6
我可以确认它起作用了,但你必须将HTML和plist放在Dropbox上。
它也适用于非企业OTA,即你想与你的开发团队分享应用程序。
我做了以下事情:
a)在我的网站上制作了一个页面,并包含以下链接:
href="https://dl.dropboxusercontent.com/u//(your DB id)/ipa.html">MyApp
b)在DropBox上编写了另一个HTML页面:
.. https://dl.dropboxusercontent.com/u/(your DB id)/MyApp.plist"> 点击安装MyApp c)将plist文件移动到DropBox上,但仍指向我的旧服务器(没有https)。

7
我不需要放HTML代码,只使用plist文件就可以正常运行。 - Ben G
这是哪个 plist 文件?是 app.plist 还是构建 IPA 文件时生成的那个? - user1872384

3

打开终端并运行以下命令:curl -i https:// (.ipa文件路径不是plist)

这将告诉你安装程序是否可以看到IPA文件。如果您使用'-i'运行curl命令,则会看到完整的响应,它可能不是IPA文件。 这是安装程序看到的响应,因此如果它没有返回HTTP 200和IPA,则需要在您的端返回。

ITMS安装程序不保存来自Safari的任何上下文。如果您在Safari中通过身份验证进入安全门户,则认证cookie不会传递给安装程序。即安装程序需要能够在没有身份验证的情况下查看应用程序,这可能是您遇到“无法连接服务器”的原因。


这对我非常有帮助。谢谢! - Stanislav Pankevich
你是在要求从iPhone或MACBook的终端应用程序中运行命令吗?看起来我也遇到了同样的问题。 - user867662

2
如果您恰好拥有像AWS S3这样的运作良好的服务,那就太好了。相对而言是的 :-)
在AWS中为您的临时文件创建一个存储桶,添加一个索引文件(它可以只是一个空的index.html文件),然后使用可以连接到S3的客户端(如CyberDuck或Coda,我使用的是Coda - 在其中选择“添加网站”以获取连接窗口),然后设置附加的连接。

然后在XCode中按需构建您的企业版应用程序,并确保使用https://s3.amazonaws.com/your-bucket-name/your-ad-hoc-folder/your-app.ipa作为应用程序URL,并将其上传到您的新S3存储桶目录中。
您的itms链接应该匹配,即itms-services://?action=download-manifest&url=https://s3.amazonaws.com/your-bucket-name/your-ad-hoc-folder/your-app.plist 就这样。这仅适用于通用AWS URL-我还没有尝试过在AWS上使用自定义URL,因此您可能需要做一些不同的事情。
我决心尝试使James Webster的解决方案起作用,但我无法在Plesk上使其起作用。

2

我也遇到了同样的问题,按照上面的方法进行操作:

  • 把plist文件放到dropbox中。
  • 下载文件按钮下方会有一个文档的图片,用鼠标右键选择复制链接操作。这个链接已经是类似于 https://dl.dropboxusercontent.com/s/xyz123/app.plist?stuff=stuff 带有许多参数的链接了。
  • 删除所有参数(只留下https和.plist之间的地址)
  • 在网上寻找url编码器,选择一个链接,复制、粘贴并执行。然后将结果复制并粘贴到具有itms-services链接的html中。 顺便说一句,我把这个html放在了两个不同的位置,其中一个位置是ipa文件所在的地方。
  • 确保plist文件包含对ipa文件的绝对引用。

这两个页面都成功地安装了ios 7.1系统上的应用程序。

但是,现在ios 7.0x系统的iPhone无法安装该应用程序。

我创建了一个新问题:upgraded adhoc app deployment doesnt work on ios previous to 7.1

这两个问题密切相关,也受到官方参考文献的缺乏的影响。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接