无线iPhone应用程序分发 - itms-services协议存在问题

24
我已经按照Apple和其他博客posts的所有指示进行操作。 我已经归档了应用程序,制作了.plist和.ipa文件,并将它们放在服务器上并链接到它们。 我可以很好地安装配置文件。 但是,当我在iPhone的Safari中点击安装应用程序的链接时,什么也没有发生。 没有错误消息。 什么都没有。 链接如下:
<a href="itms-services://?action=download-manifest&url=http://mydomain.com/test/myApp.plist">Install the app</a>

你知道为什么这个不起作用吗?看起来itms-services协议已经失效了。MIME类型没问题(我可以在地址栏中指向plist文件并将其显示为文本)。


手机是否有iOS 4+系统?应用程序是否可以通过iTunes(直接连接)安装在手机上? - user467105
这不是一个直接的答案,但我会建议使用TestFlight,它是一个极好的、免费的服务,可以处理所有相关事项等等。我和很多开发者朋友和同事都在使用它,并且我强烈推荐它。我相信在某个时候他们会开始收费,或者也许会提供一些附加服务,但它非常有帮助,我肯定会乐意支付。http://testflightapp.com - Matthew Frederick
1
嗨Sol,你解决了吗?我也遇到了同样的问题!你能帮我吗?我已经添加了.plist和.ipa文件的MIME类型,但仍然不起作用! - Paresh Masani
17个回答

17

答案其实非常简单:URL需要进行“双重转义”,即

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

这是因为该值在被视为另一个URL之前会被取消转义https://example.com/My%20App.plist。这由example.com服务器对其进行取消转义,将其转义为空格。

解析器不会特殊处理加号:...&url=https://.../test/a+b在Apache日志中显示为"GET /test/a+b HTTP/1.1"。(假设所有查询字符串都是application/x-www-form-urlencoded并不明智;这仅在HTML中标准化。)

顺便说一下,看起来itms-services使用+[NSURL URLWithString:]验证URL: url=.../My%20App.plist结果没有请求,因为[NSURL URLWithString:@"https://.../My App.plist"]返回nil。然而,NSURL存在一个长期存在的bug:它会转义末尾的单个无效(BMP)字符而不是返回nil。我的测试案例:

  • url=.../test/%3c结果在日志中显示为"GET /test/< HTTP/1.1"(这绝对是无效的HTTP!)
  • url=.../test/%0a导致设备上出现错误,但没有日志消息(因为Apache将其视为格式不正确的请求)
  • url=.../test/%0d结果在日志中显示为"GET /test/\r HTTP/1.1"

当我在我的plist文件中使用%20和在我的itms-services链接中使用%2520时,它对我起作用了。 - Glenn
这绝对是我的最后一个问题了。SSL 已经完美运行,图像 URL 也已提供。除此之外,清单 URL 必须进行双重编码! - levigroker

16

当我在清单文件和应用程序归档文件的文件名中有空格时,我遇到了类似的症状。我从它们中删除了所有的空格,然后无线安装就可以使用了。看起来你的清单没有空格,所以可能你的应用文件有空格呢?


4
我从Jenkins构建服务器安装 - 你需要确保项目名称(因此URL)没有空格,因为iOS上的itms-services处理程序无法处理空格,即使它们被正确地编码成了URL。 - jhabbott
2
@jhabbott 谢谢...我刚刚花了2个小时调试并尝试不同的URL编码方式来处理itms-services url参数。将名称中的空格完全去掉解决了问题...苹果再次失败。 - chown
1
@chown &jhabbott 这不是苹果的问题,请看下面我的回答,这是查询参数在URL中必须转义的方式。 - Jordan
@Jordan 我试过使用常规的URL编码(用加号替换空格),但无法使其正常工作。我甚至在官方的苹果文档中读到过他们故意这样做的信息(虽然我不知道为什么)。如果我找到了相关页面,我会把链接发给你。 - chown

4

itms-services是苹果/iphone用于识别并验证证书以及安装应用的标识符。

在安装ipa文件之前,为了验证预配配置文件,它会连接到“ax.init.itunes.apple.com”和“ocsp.apple.com”。

如果您正在使用任何内部网络连接,请检查这些链接是否可访问?如果不行,您将无法通过空中安装方式安装该应用程序。

& 设备上的最低操作系统版本应为4.0。


ocsp.apple.com是什么?它从任何地方都无法访问! - Paresh Masani
对我来说也是一样的,它不可用。 - xarly
1
你可以通过ping服务器来找到oscp.apple.com和ax.init.itunes.apple.com。但是,这可能没有帮助,因为当我尝试将伪签名应用程序部署到越狱设备时,我不得不更改DNS服务器,以便iOS设备无法访问这些服务器。如果设备从这两个服务器都没有收到响应,它仍然会安装;它们只用于检查开发者证书是否仍然有效。 - user1522362
1
根据苹果文档,它访问ax.init.itunes.apple.com以获取通过蜂窝网络下载应用程序的当前文件大小限制。如果无法访问此站点,则可能安装失败,然后它将访问ocsp.apple.com以检查用于签署预配文件的分发证书的状态。 - Durai Amuthan.H

3
我使用的是IIS 6.0,index.html页面可以加载,但当用户从苹果设备(即iPhone 4)点击.plist链接时,我一直收到“无法连接www.mywebsite.com”的提示。除了添加MIME类型之外,解决方案是共享包含.plist文件的Web共享,并且最重要的是:更改清单.plist文件的安全访问权限。将完全控制权授予默认Windows用户。

4
我已经完全允许了 plist 文件,但它仍然没有做任何事情!"Web sharing"是什么意思?谢谢。 - Paresh Masani
1
是的,我也想知道您所说的Web Sharing是什么意思。另外,您如何更改mainfest .plist文件的安全访问权限? - user717236

2

这个答案真的很有帮助!我们必须确保 MIME 类型被正确设置,并且文件是可访问的!谢谢! - NicTesla

2

看起来你这里有几个指针可以找到问题所在,下次可以检查一下从 Xcode 组织器查看设备控制台,通常会包含有关 OTA 分发失败的有用信息。


听起来真的很棒,但是XCode如何知道你的OTA分发失败了呢?它在你的Web服务器和设备之间,对吧?有没有一些我不知道的从XCode管理OTA分发的方法?或者如果你在尝试OTA分发时将设备连接,它会检测到错误吗? - morningstar
2
不,我的意思是在尝试使用OTA下载时检查Xcode组织器的设备日志,可能会给您一些提示。 - Sveinung Kval Bakken
这个答案帮助我解决了问题。干得好。 - woody121

1

如果有人对动态生成plist感兴趣,以下示例使用PHP:

$appUrl='itms-services://?action=download-manifest&url=http://server/iOSpList.php?'.
                'url%3D'.$app['url'].
                '%26bundle%3D'.$app['bundle'].
                '%26version%3D'.$app['version'].
                '%26name%3D'.$app['name'];

同时,请确保返回的 MIME 类型为 application/xml

1
我遇到了与上述相同的问题。尝试了所有方法都失败后,我发现在归档应用程序时,我没有在设置中输入应用程序URL,因此这个URL从未出现在我的plist文件中。请确保在查看plist文件时,应用程序URL已经存在其中。

我已经设置了一个脚本来完成这个任务,但是我假定它能够正确地执行。但实际上并没有。 :P - James Webster

1
请确保所有的URL都是完全合格的,包括那些PNG文件的URL。

请告诉我在哪里可以找到关于合格URL的参考文档。一些字符可以被转义,但不包括应用程序。 - Alex Zavatone
完全限定名指的是以http://开头,包含域名等信息的路径,而不是相对路径。转义字符有时是必要的,但这是另一个问题。 - morningstar

1

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