4

我的 Ad-Hoc 构建的无线 (OTA) 分发存在问题。使用基本 SDK 6.1、部署目标 5.0、架构 armv7 和 armv7s 构建通用 iPhone/iPad 应用程序。相同的 ad-hoc 构建在 iOS 6 设备(3 种不同的 iPhone5、一个 iPhone4 和 iPad2)上安装 OTA,但无法在 iOS 5 设备(iPhone4S 和 iPad1)上安装 OTA。

OTA 通过正确设置所有 MIME 类型的 IIS 发生(否则 iOS 6 将失败)。

在 iOS 5 设备上,它开始安装显示带有进度条的应用程序图标,第一个标题是“等待...”,然后更改为应用程序名称,然后警报视图显示说

无法下载应用程序

目前无法下载。

完成/重试

将设备连接到 Xcode 以查看管理器中的日志。控制台具有以下内容:

apsd [48] : : 发生流错误:错误域 = NSPOSIXErrorDomain 代码 = 61“操作无法'-t -be -completed-。-Connection -refused-” -UserInfo-=-0-x-1-4- 7-0-8-0 -{-}

完全一样,包括“-”字符。

通过 iTunes 同步在相同的 iOS 5 设备上安装相同的 ad-hoc 构建按预期工作,没有错误。

帐户类型是“普通”开发人员帐户,而不是企业帐户。

我已经尝试从头开始创建所有配置文件。还没有尝试删除和创建新证书,希望它不是必需的。

应用程序不使用 iCloud 或推送,或任何东西。捆绑包中不包含 Entitlements.plist。

可能很重要的一点是,应用程序是使用 CocoaPods 构建的——一组构建为 Pod 目标的 3rd 方库。

4

5 回答 5

3

好吧,您一定会惊讶地发现真正的原因是什么。

我最终撤销了所有证书,删除了配置文件,从 CSR 一直到设置构建环境。我确实尝试了权利和“获取任务允许”和其他东西。但这些都没有奏效。

在某个时候,我决定再看看用于分发的 IIS 服务器和 plist 文件。就这样,问题出在 plist 文件上。iTunes 艺术品图像文件名为“iTunesArtwork.png ,plist 文件中的 url 为http://hostname/Mobile/iOS/iTunesArtwork.

所以我将文件重命名为“iTunesArtwork”(删除了扩展名),这并没有解决问题,但我现在可以看到安装进度条快要结束了,状态消息从“正在下载”变为“正在安装”。在此之前,它在一开始就失败了,就在说“等待”之后。

最后,我把所有的东西都整理好,将文件命名为“iTunesArtwork.png”,并将 url 固定为http://hostname/Mobile/iOS/iTunesArtwork.png

这就是它起作用的时候。

我只能想出以下解释:

在安装开始之前,iOS 会检查 plist 中的所有 url 是否都指向有效资源。如果其中任何一个失败,iOS 5 将中止安装,而 iOS 6 至少可以容忍无效的艺术品 url。

在安装过程中,iOS 首先获取应用程序图标以将其显示在屏幕上,然后下载 ipa 文件,最后获取艺术品。在这里,iOS 5 有更严格的验证规则,它不喜欢像“iTunesArtwork”这样的名字,我认为它只是不喜欢没有扩展名的文件名。如果获取图稿失败,iOS 5 上的整个安装将中止。iOS 6 在这个阶段似乎忽略了错误。

我个人认为 iOS 5 的做法是正确的。验证所有 url 是否有效并且所有文件都具有正确的扩展名是一件好事。如果两个 iOS 版本都以相同的方式执行此操作,我会在一开始就偶然发现这个问题。

UPD

刚刚尝试在 Mac OS X 10.8 上运行 apache Web 服务器设置。可以肯定地说,与 IIS 不同,使用 apache 的 iOS 5 可以很好地容忍缺少的扩展,所以不仅仅是 iOS 5,而是 iOS 5 和 IIS 的混合会导致所有问题。

但是,如果我将诸如http://hostname/Mobile/iOS/NoSuchFilein plist 之类的东西放在 artifact 的位置,那么 iOS 5 将无法安装 OTA,而 iOS 6 甚至不会注意到任何东西并继续安装。

于 2013-02-18T00:59:02.883 回答
2

向您的项目添加一个权利文件,并将其“get-task-allow”设置为“NO”。在我这样做之前,我也遇到过类似的问题;OTA 有时会起作用,有时不会。尽管苹果公司说它应该在没有权利文件的情况下工作,但似乎不再是这种情况了。

确保将“get-task-allow”设置回“YES”以进行正常开发/调试。

作为参考,这里是权利文件的内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>keychain-access-groups</key>
    <array>
        <string>$(AppIdentifierPrefix)com.yourCompany.yourAppname</string>
    </array>
    <key>get-task-allow</key>
    <false/>
</dict>
</plist>

当然,您需要将“yourCompany.yourAppname”替换为您的应用标识符。

于 2013-02-15T16:52:55.420 回答
1

我在 diawi 或 testflight 中遇到了这个问题。一旦它开始不起作用,您应该删除设备上部分下载的应用程序。

您是否尝试过在 ipa 之前发送和安装证书?

于 2013-02-16T00:32:53.087 回答
1

根据我的经验,有几个步骤可以解决我们许多人都经历过的这个问题;

  1. 确保您的设备 UDID 已在供应门户中注册并链接到您正在使用的供应配置文件。

  2. 在签署应用程序之前(同时使用“存档”选项编译它),刷新到可用的最新配置文件,可能通过删除管理器中显示的旧配置文件并按底部的“刷新”,然后登录到您的开发者帐户.

  3. 将签名身份设置为“分发”(Ad hoc)。如果您使用“Build”编译它并上传到像 Diawi 这样的服务,这至少会有所帮助。如果您确实使用了 Diawi 之类的服务,请上传您签署的移动配置文件(即 Ad-Hoc 文件),并让您的用户在安装应用程序之前通过 Diawi 提供的界面安装它。

  4. 使用临时“分发”配置文件而不是“开发”配置文件为应用程序签名 - 这至关重要!

祝你好运!

于 2013-02-17T19:36:46.123 回答
0

试试这个选择所有第三方库,不包括你在 xcode 中的项目,并在构建设置中将跳过安装设置为是。

于 2013-02-15T16:27:30.570 回答