【问题标题】:wireless iphone app distribution - problem with itms-services protocol无线 iphone 应用程序分发 - itms-services 协议的问题
【发布时间】:2011-01-14 19:41:33
【问题描述】:

我遵循了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(直接连接)安装在手机上?
  • 这不是一个直接的答案,但我会推荐 TestFlight,这是一个非常好的免费服务,可以处理所有这些以及更多。我和我的许多开发人员朋友和同事都在使用它,我强烈推荐它。在某些时候,我确信他们会开始为此收费,或者可能会为附加服务收费,但它非常有帮助,我相信我会很乐意付款。 testflightapp.com
  • 嗨,索尔,您解决了吗?我面临同样的问题!你能帮我吗。我为 .plist 和 .ipa 文件添加了 MIME 类型,但仍然无法正常工作!

标签: ios


【解决方案1】:

当清单文件和应用程序存档文件的文件名中有空格时,我也有类似的症状。我从它们中删除了所有空间,无线安装对我有用。您的清单似乎没有空格,所以您的应用文件可能有?

【讨论】:

  • 我从 Jenkins 构建服务器安装 - 您需要确保项目名称(以及 URL)没有空格,因为 iOS 中的 itms-services 处理程序无法处理空格,即使它们是正确的 URL 编码。
  • @jhabbott 谢谢...我刚刚花了 2 个小时调试并尝试了不同的 url 编码方式 itms-services url 参数。完全去掉名称中的空格修复了它......Apple再次失败了。
  • @chown &jhabbott 这不是 Apple 的失败 请看下面我的回答,这是必须在 URL 中转义查询参数的方式。
  • @Jordan 我无法通过常规的 URL 编码(加上替换空格)让它工作,我想我什至在 Apple 官方文档的某个地方读到这是他们故意完成的(不知道为什么)。如果我找到该页面,我会链接它。
【解决方案2】:

答案其实很简单:网址需要“双转义”,即

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

这是因为在被视为另一个 URL 之前,该值 未转义https://example.com/My%20App.plist。这不会被example.com 的服务器转义到一个空间。

解析器特别对待 +:...&amp;url=https://.../test/a+b 导致 "GET /test/a+b HTTP/1.1" 出现在 Apache 日志中。 (假设所有查询字符串都是application/x-www-form-urlencoded 是不明智的;这仅在 HTML 中标准化。)

顺便说一句,itms-services 似乎使用+[NSURL URLWithString:]验证 URL:url=.../My%20App.plist 导致没有请求,因为[NSURL URLWithString:@"https://.../My App.plist"] 返回nil。但是,NSURL 中存在一个长期存在的错误:它会在末尾转义单个无效 (BMP) 字符,而不是返回 nil。我的测试用例

  • url=.../test/%3c 导致日志"GET /test/&lt; HTTP/1.1"(这绝对是无效的HTTP!)
  • url=.../test/%0a 导致设备出错但没有日志消息(因为 Apache 将其视为格式错误的请求)
  • url=.../test/%0d 导致日志"GET /test/\r HTTP/1.1"

【讨论】:

  • 当我在我的 plist 文件中使用 %20 并在我的 itms-services 链接中使用 %2520 时,它就起作用了。
  • 这绝对是我的最后一期。我让 SSL 完美运行。我提供了图片 URL。以及其他所有内容,但清单 URL 必须进行双重编码!
【解决方案3】:

itms-services 是一个标识符,apple/iphone 将通过该标识符识别它应该验证证书并应该安装。

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

如果您使用任何内部网连接,请检查这些链接是否可以访问?如果没有,您将无法通过无线方式安装应用程序。

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

【讨论】:

  • ocsp.apple.com 是什么?它在任何地方都无法使用!
  • 我也一样,不可用
  • 您可以通过 ping 服务器找到 oscp.apple.com 和 ax.init.itunes.apple.com。无论如何,这可能无济于事,因为当我尝试将伪签名应用程序部署到越狱设备时,我必须更改 DNS 服务器,以便 iOS 设备无法访问这些服务器。如果两台服务器都没有响应,设备仍会安装;它们仅用于检查开发者证书是否仍然有效。
  • 根据苹果文件“它访问 ax.init.itunes.apple.com 以获取通过蜂窝网络下载应用程序的当前文件大小限制。如果无法访问此站点,安装可能失败则访问 ocsp.apple.com 以检查用于签署配置文件的分发证书的状态”
【解决方案4】:

我使用的是 IIS 6.0,并且 index.html 页面正在加载,但是当用户从苹果设备(即 iphone 4)单击 .plist 链接时,我不断收到“无法连接 www.mywebsite.com”。除了添加 MIME 类型之外,解决方案是共享 .plist 文件所在的 Web 共享,最重要的是:更改清单 .plist 文件的安全访问。完全控制默认 Windows 用户

【讨论】:

  • 我已经完全允许 ​​plist 文件,但它仍然没有做任何事情!网络共享是什么意思?谢谢。
  • 是的,我也想知道您所说的网络共享是什么意思。以及如何更改 mainfest .plist 文件的安全访问权限?
【解决方案5】:

【讨论】:

  • 这个答案真的很有帮助!!我们必须确保正确设置 MIME 类型,并且该文件是可访问的!!谢谢!!!
【解决方案6】:

似乎您在这里有几个可能是问题的指针,下次:从 Xcode Organizer 检查设备控制台,它通常包含有关失败的 OTA 分发的有用信息。

【讨论】:

  • 这听起来真的很棒,但是 XCode 如何知道您的 OTA 分发是否失败?它在您的网络服务器和设备之间,对吧?有什么方法可以管理我不知道的 XCode 的 OTA 分发吗?或者,如果您在尝试 OTA 分发时连接了设备,它会检测到错误吗?
  • 不,我的意思是在尝试使用 OTA 下载时检查 Xcode Organizer 的设备日志,可能会给您一些提示。
  • 这个答案帮助我弄清楚了我的问题。好电话。
【解决方案7】:

确保所有 URL 都是完全限定的。包括那些用于 png 文件的文件。

【讨论】:

  • 请告诉我在哪里可以找到有关构成合格 URL 的参考文档。某些字符可以转义,但应用程序不行。
  • 完全限定意味着它以 http:// 开头,有域名等。不是相对路径。有时需要转义字符,但这是另一个问题。
【解决方案8】:

我遇到了和上面一样的问题。在尝试了上述所有方法并失败后,我发现当我归档我的应用程序时,我没有在设置中输入应用程序 URL,因此这个 URL 从未出现在我的 plist 文件中。确保在查看 plist 文件时,应用程序 URL 就在其中。

【讨论】:

  • 我设置了一个脚本来执行此操作,并假设它正确执行。不是。 :P
【解决方案9】:

与之前的许多其他人一样,我也遇到过这个守护进程的问题。就我而言,问题是 plist 文件的格式不正确。确保文件遵循文档中概述的确切模式:http://developer.apple.com/library/ios/#featuredarticles/FA_Wireless_Enterprise_App_Distribution/Introduction/Introduction.html

【讨论】:

    【解决方案10】:

    对于任何对动态生成 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

    【讨论】:

      【解决方案11】:

      我完全按照您的描述遇到了这个问题,结果我的问题是我在 url 中错过了“http://”。在我将此部分添加到 .plist 文件中的 url 字段后,一切正常。希望对您有所帮助!

      【讨论】:

        【解决方案12】:

        在使用 AdHoc 配置文件分发我的应用程序时,我遇到了类似的问题。我尝试删除旧配置文件、生成新配置文件、重新启动 Xcode、清理和重建、检查 URL 路径名称等。该应用程序将安装在某些设备上,但不会安装在其他设备上。

        对我有用的是更改应用版本并构建到更新的编号。

        【讨论】:

          【解决方案13】:

          我发现 ios 6 的“无法使用 index.html”来安装应用程序。通过从“index.html”更改为“dev.html”修复。希望对某人有所帮助

          【讨论】:

            【解决方案14】:

            我同时尝试了一些,所以我不确定哪个是好的。

            创建通配符应用 ID(名称通配符,bunde 标识符 *),为此应用创建配置文件并使用此配置文件签署 ipa。

            在配置门户上注册了一台设备。

            将我链接应用程序 dev.html 的文件命名为 index.html

            【讨论】:

              【解决方案15】:

              正确的解决方法是用“+”(加号)替换空格,因为 ...url=... 表示它是查询字符串参数,编码时应编码为表单数据参数用于 URL。

              从这里W3.org - Forms in HTML documents:

              “控件名称和值被转义。空格字符被'+'替换,然后保留字符被转义,如[RFC1738]中所述”

              附:这解决了我们在开发 icenium.com 时遇到的相同问题。 您可以在那里查看 AdHoc 条款签名,并了解它对于名称中带有空格的项目是如何工作的。

              【讨论】:

              • 讨厌告诉你 Jordan,这在 iOS 5.0.1 中不起作用。用 + 替换 URL 中的空格会返回找不到服务器错误。在 iOS 6.1 中,会出现相同的行为。
              • 我检查了代码,似乎我们使用了 + 但实现了一个自定义处理程序,并且 url 是这样的:server.com/plist?pn=a+app+name+with+space 并再次将 url 编码为这样的东西:itms-services:/ /?action=download-manifest&url=https%3A%2F%2Fserver.com%2Fplist%3Fpn%3Da%2Bapp%2Bname%2Bwith%2Bspace(我们将处理程序中的 ContentType 设置为 text/plain 但 text/xml 可能更好,我们将 .ipa 用作 ContentType:application/octet-stream)
              • plist 中的 url 可以使用 %20 &lt;string&gt;https://server.com/folder%20with%20space/app%20project%20with%20space.ipa&lt;/string&gt; 转义的空格
              • 哇。谢谢你。我会在我们这边测试。我同意 pList 中的 URL 可以进行空格转义,但它也可以在我的测试中使用,而根本不会转义空格字符。这需要记录在案。太疯狂了。
              【解决方案16】:

              如果您通过电子邮件发送链接,则不能在电子邮件中使用 HTML 格式。您必须使用“富文本”格式

              不知道为什么,但就是这样(至少在 Outlook 中)

              【讨论】:

                【解决方案17】:

                我认为您还需要将其设为 https,如 https://mydomain

                【讨论】:

                  猜你喜欢
                  • 2014-07-16
                  • 2012-02-11
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-02-15
                  • 2013-12-12
                  • 1970-01-01
                  相关资源
                  最近更新 更多