【问题标题】:iOS Ad-Hoc OTA distribution works for iOS 6 and fails with iOS 5 [closed]iOS Ad-Hoc OTA 分发适用于 iOS 6,但适用于 iOS 5 [关闭]
【发布时间】:2013-02-07 06:16:02
【问题描述】:

我的 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 设备上,它开始安装,显示带有进度条的应用程序图标,第一个标题是“Waiting...”,然后更改为应用程序名称,然后显示警报视图

无法下载应用程序

此时无法下载。

完成/重试

将设备连接到 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 目标的第三方库。

【问题讨论】:

标签: ios xcode ad-hoc-distribution ota


【解决方案1】:

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

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

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

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

最后,我把所有的东西都整理好了,将文件命名为“iTunesArtwork.png”,并将网址固定为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/NoSuchFile 之类的东西放在 plist 中代替原图,那么 iOS 5 将无法安装 OTA,而 iOS 6 甚至不会注意到任何事情并继续安装。

【讨论】:

  • 如果真的是这样的话,那就太棒了
  • 好吧,我可能错把一切都归咎于 iOS。可能是 IIS 设置造成了一些小麻烦。我希望我有时间从 OS X Server 测试 OTA 并检查问题是否仍然存在。
  • 试试迪亚维。不敢相信他们使用 IIS :) 应该更快
  • 我通常在自己的项目中坚持使用 TestFlight。有了这个,我们需要有“原始”OTA,没有第三方。
  • 确实是非常复杂的错误。非常非常复杂。如果我是你,我会将此错误命名为答案中的标题!如“'weird iOS 5 处理mime types and file name extenion on IIS' error”。我已经读了几次你的问题和回答太快了,完全错过了你的意思。重要的是要以一种一眼就能吸引读者眼球的方式写作。特别是在 StackExchange 网络中。
【解决方案2】:

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

确保将“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”替换为您的应用标识符。

【讨论】:

  • 我明天试试这个看看。我可以确定没有权利文件,所以这可能有效,至少我希望如此。
  • 没用。我尝试将get-task-allow设置为YES,NO,完全删除,没有成功。我显然想念与 iOS 5 和 iOS 6 相关的一些东西,但到目前为止我不知道那是什么。
  • @fishinear 我的 OTA 有问题,有时可以,有时不行。当您添加权利时,您是否保留了 $(AppIndentifierPRefix)?
  • @Alan 是的,$(AppIdentifierPrefix) 在里面。
【解决方案3】:

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

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

【讨论】:

  • 您的意思是配置文件吗?是的,也试过了,没有运气。我至少有 3 台我从未接触过的设备,只是获得了他们的 UDID 并将这些设备添加到临时配置文件中,甚至没有与这些人共享配置文件。他们能够毫无问题地安装 OTA,当然所有这些 iPhone 都运行 iOS 6。就我而言,很明显 iOS 6 可以正常工作,而 iOS 5 不能。
【解决方案4】:

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

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

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

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

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

祝你好运!

【讨论】:

  • 我不止一次检查了整个例程。就目前而言,我可以打赌并说这些步骤是正确的。如果我在其中任何一个中犯了错误,那么 iOS5 和 iOS6 都会失败,即使是普通的 iTunes 同步也会失败,但事实并非如此。
  • 总是在这里提供帮助,无论有没有艺术品 png 的 :)!但我很高兴您为您的案例找到了正确的解决方案。
  • 如果您想要更大的清单:stackoverflow.com/a/19661276/274502
【解决方案5】:

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

【讨论】:

  • 该标志已设置,cocoapods 在生成 Pods 项目文件时会这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多