iOS Ad-Hoc OTA分发适用于iOS 6,但在iOS 5上失败。

4
我在Ad-Hoc构建的OTA分发方面遇到了问题。 使用基础SDK 6.1、部署目标5.0、体系结构为armv7和armv7s来构建通用的iPhone/iPad应用程序。同一个Ad-Hoc构建可以在iOS 6设备上进行OTA安装(3个不同的iPhone5、一个iPhone4和iPad2),但不能在iOS 5设备上进行OTA安装(iPhone4S和iPad1)。
OTA通过IIS进行,所有MIME类型都已正确设置(否则将会在iOS 6上失败)。
在iOS 5设备上,它开始安装并显示带有进度条的应用程序图标,第一个标题是“等待...”,然后更改为应用程序名称,然后警报视图显示如下内容:
无法下载应用程序 此时无法下载。
连接设备到Xcode以在组织者中查看日志。 控制台显示以下内容:
apsd[48]::出现流错误:Error Domain=NSPOSIXErrorDomain Code=61 "The operation couldn’-t -b-e -c-o-m-p-l-e-t-e-d-. -C-o-n-n-e-c-t-i-o-n -r-e-f-u-s-e-d-" -U-s-e-r-I-n-f-o-=-0-x-1-4-7-0-8-0 -{-}
完全是这样,包括“-”字符。
通过iTunes同步在相同的iOS 5设备上安装相同的Ad-Hoc构建可正常工作,没有错误。
帐户类型是“普通”开发人员帐户,不是企业帐户。
我已经尝试从头开始创建所有配置文件。还没有尝试删除并创建新的证书,希望不需要这样做。
应用程序不使用iCloud、推送或任何其他功能。包中未包含Entitlements.plist。
可能重要的一点是,应用程序是使用CocoaPods构建的——一堆第三方库构建为Pods目标。

这是一种重复的问题:https://dev59.com/W2Ys5IYBdhLWcg3wE_ze - cregox
5个回答

3
好的,你会惊讶地发现问题的真正原因。
我撤销了所有证书,删除了配置文件,从CSR开始一直到设置构建环境。我尝试了授权和“get-task-allow”等内容。但是这些都没有解决问题。
最后,我决定再次查看用于分发的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版本都以相同的方式处理,我将在一开始就遇到问题。
更新:刚刚尝试了在Mac OS X 10.8上运行的apache web服务器设置。可以确定,与IIS不同,使用apache时,iOS 5对缺少扩展名非常容忍,因此不仅仅是iOS 5,而是iOS 5和IIS的混合导致了所有麻烦。
但是,如果我在plist中放置类似于http://hostname/Mobile/iOS/NoSuchFile的内容,那么iOS 5将无法安装OTA,而iOS 6甚至不会注意到这件事并继续安装。

2
如果真的是那样,那就太不可思议了。 - Ben Max Rubinstein
嗯,我可能错怪了iOS。这可能是由IIS设置造成的一点小麻烦。我希望有时间从OS X服务器测试OTA并检查问题是否仍然存在。 - i4niac
尝试使用Diawi。无法相信他们使用IIS :) 应该更快。 - Ben Max Rubinstein
我通常在自己的项目中使用TestFlight。但是这个项目需要“原始”的OTA,不能使用第三方工具。 - i4niac
非常复杂的错误。非常非常复杂。如果我是你,我会给这个错误起个名字,并将其作为答案的标题!比如“奇怪的iOS 5在IIS上处理mime类型和文件扩展名的错误”。我已经快速读了你的问题和答案几次,完全错过了你的观点。以一种能够吸引读者注意的方式进行写作非常重要,尤其是在StackExchange网络中。 - cregox

2
将一个entitlements文件添加到你的项目中,并将其"get-task-allow"设置为"NO"。在我做这个之前,我也遇到了类似的问题;OTA有时候可以工作,有时候又不行。即使苹果公司说它应该可以在没有entitlements文件的情况下工作,但现在似乎并非如此。
确保将“get-task-allow”为正常开发/调试重新设置为“YES”。
以下是entitlements文件的内容供参考:
<?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”替换为您的应用程序标识符。

明天我会试一下,看看能不能行。我可以确定没有授权文件,所以这可能有效,至少我希望如此。 - i4niac
1
没成功。我尝试过将get-task-allow设置为YES、NO,甚至完全删除它,都没有效果。 显然有些关于iOS 5和iOS 6的问题我还没有理解透彻,但目前为止我还不知道是什么。 - i4niac
@fishinear 我的OTA有时候能用,有时候不能用,我遇到了问题。当你添加授权时,你是否保留 $(AppIndentifierPRefix)? - Alan
@Alan 是的,$(AppIdentifierPrefix) 已经在里面了。 - fishinear

1
我在使用Diawi或TestFlight时遇到了这个问题。一旦它开始无法工作,您应该在设备上删除部分下载的应用程序。
您是否尝试在IPA之前发送和安装证书?

你是指配置文件吗?是的,我也试过了,但没有成功。我至少有三个设备从未接触过,只获取了它们的UDID并将这些设备添加到了Ad-hoc配置文件中,甚至没有与这些人共享配置文件。他们能够无问题地安装OTA,当然所有这些iPhone都运行iOS 6。在我的情况下,很明显iOS 6可以工作而iOS 5不行。 - i4niac

1

根据我的经验,有几个步骤可以解决我们中许多人遇到的问题:

  1. 确保你的设备UDID已在预配门户注册,并与你正在签名的预配文件相关联。

  2. 在签名应用程序之前(使用“存档”选项编译它时),刷新最新可用的配置文件,可能需要删除组织者中显示的旧配置文件,然后在底部按“刷新”按钮并登录开发者帐户。

  3. 将签名标识设置为“分发”(Ad hoc)。这样至少可以帮助你使用“构建”编译并上传到像Diawi这样的服务。如果你确实使用了Diawi这样的服务,请上传你签名的移动预配文件(Ad-Hoc版),并要求用户在安装应用程序之前通过Diawi提供的界面安装它。

  4. 使用Ad-Hoc“分发”配置文件而不是“开发”配置文件签名应用程序-这非常重要!

祝好运!


1
我检查了整个程序不止一次。就目前而言,我可以打赌并说这些步骤是正确的。如果我在其中任何一个步骤中犯了错误,那么iOS5和iOS6都会失败,甚至普通的iTunes同步也会失败,但事实并非如此。 - i4niac
无论是否有png文件,我都很乐意提供帮助 :)!不过,我很高兴你最终找到了正确的解决方案。 - Ben Max Rubinstein
如果你想要一个更大的清单:https://dev59.com/W2Ys5IYBdhLWcg3wE_ze#19661276 - cregox

0

尝试在Xcode中选择所有第三方库,但不包括您的项目,并在构建设置中将跳过安装设置为是。


那个标志被设置了,当CocoaPods生成Pods项目文件时会这样做。 - i4niac

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