iOS 企业 OTA 分发无法下载应用程序

Posted

技术标签:

【中文标题】iOS 企业 OTA 分发无法下载应用程序【英文标题】:iOS Enterprise OTA distribution Unable to Download Application 【发布时间】:2012-10-31 21:46:19 【问题描述】:

我创建了一个 ios 应用并希望通过无线方式分发它。我遵循了这个指南:

http://help.apple.com/iosdeployment-apps/mac/1.1/?lang=en-us#app43ad77ea

应用程序使用企业证书签名并包含分发配置文件。

当我尝试将应用程序下载到 ipad 上(使用本指南中描述的技术)时,屏幕上会出现一个带有我的下载图标的方形图标,名称为“Waiting...”,然后一秒钟后显示名称更改为我的实际应用程序名称,然后一秒钟后我再次收到错误消息:

无法下载应用程序

目前无法下载“您的应用程序”。

在指南中,有三个故障排除提示:

如果无线应用分发失败并显示“无法下载” 消息,请检查以下内容:

确保应用已正确签名。通过将其安装在 使用 iPhone 配置实用程序或 Apple Configurator 的设备,以及 看看有没有错误。

确保清单文件的链接正确且清单 文件可供网络用户访问。

确保 .ipa 文件(在清单文件中)的 URL 正确无误 并且 .ipa 文件可供网络用户访问。

我检查了所有三件事,它们都很好。

还有什么可能导致我的下载问题?

【问题讨论】:

尝试为 .ipa 文件设置正确的 mime 类型:“AddType application/octet-stream .ipa”(用于 Apache 服务器)。检查***.com/questions/3728601/… 我不得不重建 - 似乎存档 (ipa) 丢失了一半文件。整个过程中没有来自 xcode 的错误消息。 【参考方案1】:

正如 alexey 提到的,太多的原因可能会导致该消息。 Apple 将其用作“捕获所有错误”。

您可以通过控制台进行诊断。将设备连接到您的桌面并从 XCode 的 Organizer(仅限 mac)或 iPhone Configuration Utility(mac 和 windows)访问它。但是……

没那么简单! :-(

控制台可能还远远不够。有时那里没有相关消息

那么,最后的选择是following a checklist。再次从零开始。有很多 out there... 但下面是我的通用且不详细的无线分发清单



    有一个分发版本 - 这是最复杂的部分,总是在网络上完成,Apple 一直在改变这些步骤。一般来说,您需要一个证书、一个标识符供应配置文件几乎总是需要列出设备。我目前的选择是“Distribution -> In House”。

    P.S.:如果您确实想列出设备,请确保 UDID 正确。此处报告了许多问题。

    在 Project -> Build Settings 下设置配置文件 - 从 XCode 5 开始,情况发生了变化。您可以清除所有内容并将其设置在 *Code Signing -> *Provisioning Profile 下,而不是使用 identity 进行 代码签名。身份应自动更改为“自动”。也不再需要从第 1 步手动下载文件并安装它们。 XCode 现在管理它。

    存档 - 在 Xcode 5 中,不再需要“为存档而构建”。存档就行了。它应该会出现在 Organizer 上,如果它是一个大项目,则需要一些时间。这一步可能会出现很多错误,但它们几乎总是与代码编译有关,而不是与 OTA 相关。

    部署 - 现在在 Organizer -> Archives 中,选择正确的存档(应该已经被选为最新的)点击“分发 em>”,然后保存用于企业或临时部署。现在可能要等很久了。保存文件时,可以选择“保存以供企业分发”。这是一个完全误导的名字。它真正做的是创建 plist 文件。如果你已经有一个,那很好。您甚至可以手动编辑它,这通常会更好。步骤 (5) 需要 plist。这是一个很好的:

    <?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>items</key>
        <array>
            <dict>
                <key>assets</key>
                <array>
                    <dict>
                        <key>kind</key>
                        <string>software-package</string>
                        <key>url</key>
                        <string>http://example.com/app.ipa</string>
                    </dict>
                    <dict>
                        <key>kind</key>
                        <string>full-size-image</string>
                        <key>needs-shine</key>
                        <false/>
                        <key>url</key>
                        <string>http://example.com/FullSizeImage.png</string>
                    </dict>
                    <dict>
                        <key>kind</key>
                        <string>display-image</string>
                        <key>needs-shine</key>
                        <false/>
                        <key>url</key>
                        <string>http://example.com/Icon.png</string>
                    </dict>
                </array>
                <key>metadata</key>
                <dict>
                    <key>bundle-identifier</key>
                    <string>com.example.app</string>
                    <key>kind</key>
                    <string>software</string>
                    <key>subtitle</key>
                    <string>for iOS</string>
                    <key>title</key>
                    <string>My App</string>
                </dict>
            </dict>
        </array>
    </dict>
    </plist>
    

    分发 - 如果您想使用 XCode 或 iPhone 配置实用程序安装它,请跳过此步骤。你完成了。这是将文件放在网站上。 “简单地”添加一个带有 a href 链接的 html 页面,例如:

     itms-services://?action=download-manifest&url=http://example.com/app.plist
    

    不幸的是,处理 Web 服务器绝非易事。同样check the server mime-type!如果您的服务器支持 php,我已经制作了几个 PHP 文件来处理它们。只需保持文件原样(plisthtmlipa)并链接到app.plist.php

    app.plist.php

    $file = fopen("app.plist", "r");
    while(!feof($file))
        $line = fgets($file);
        print str_replace(".ipa", ".ipa.php", $line);
    
    fclose($file);
    ?>
    

    app.ipa.php

    <?php
    header('Content-type: application/octet-stream');
    
    $file = fopen("app.ipa", "r");
    while(!feof($file))
        $line = fgets($file);
        print $line;
    
    fclose($file);
    ?>
    

    验证 - 确保资产数组中列出的所有文件都可供下载。如果这些文件中的任何一个返回 404 或类似(包括图标),则整个安装将失败。您必须 (A) 使这些文件可用或 (B) 从 plist 中删除那些缺失的条目。下载工作不需要图标条目。

    这是一个没有图标的示例 plist:

    <?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>items</key>
        <array>
            <dict>
                <key>assets</key>
                <array>
                    <dict>
                        <key>kind</key>
                        <string>software-package</string>
                        <key>url</key>
                        <string>http://example.com/app.ipa</string>
                    </dict>
                </array>
                <key>metadata</key>
                <dict>
                    <key>bundle-identifier</key>
                    <string>com.example.app</string>
                    <key>kind</key>
                    <string>software</string>
                    <key>subtitle</key>
                    <string>for iOS</string>
                    <key>title</key>
                    <string>My App</string>
                </dict>
            </dict>
        </array>
    </dict>
    </plist>
    

文件示例是清单中非常重要的一部分。它们必须 100% 正确。

仔细检查 plist 和 html 文件!

P.S.:我正在写这个答案,因为就我而言,这是 .plist 文件上错误链接的“简单”问题。而且,因此,很难诊断。好吧,只有做这个清单才能找到错误!它指向“another-app.ipa”而不是“app.ipa”!

【讨论】:

这条线帮助我让它工作。 ` example.com/app.ipa</string>, make sure software-package` 关键点指向实际的 IPA +1 表示控制台提示。准确描述应用无法安装的原因,而不是显示在设备上的通用“无法安装”消息。 @n00neimp0rtant 如果这是原因,请给alexey there +1。他想出了这个! ;-) 关于#6 令人讨厌的部分是控制台没有关于安装失败原因的信息。希望这可以帮助某人花费我调试它的时间! 我只想再次强调@cregox 提到的最后一点。我刚刚在通往 .ipa 的错误路径上浪费了几个小时……三重检查伙计们;)【参考方案2】:

导致此消息的原因有很多。

诊断它的最佳方法是将设备连接到 Mac,然后在 Organizer 中查看 Console 设备。

以我为例,它是:

verify_bundle_metadata:此应用不是为支持此设备系列而构建的

【讨论】:

几乎完美!欲了解更多信息,请read my answer。 更新了 Xcode 6 及更高版本的答案。 Devices 已从 Organizer 中分离出来。在 Xcode 6 或 7 中,进入 Window > Devices,选择设备,然后在左下角有一个带有箭头的框。单击它,它将展开先前最小化的控制台。我以这种方式发现了我的问题,仅供参考,它是不正确的捆绑标识符!我们更改了捆绑包名称,但重用了以前版本的 plist 文件,也忘记在那里更新它。 在控制台中很难找到相关位置,因为它一直在记录,搜索字符串“Install complete for download”或“Apps Failed be installed”等【参考方案3】:

回答我自己的问题:

问题是其中一个缩略图没有在 manifest.plist 中设置正确的路径 - 所以不仅 ipa 需要正确的路径,还需要临时下载图标,否则安装将失败并出现上述错误消息。

【讨论】:

嗯,同样的问题,但这并没有为我解决问题 @d2burke 设置服务器 MIME 类型 您可能需要配置您的 Web 服务器,以便正确传输清单文件和应用程序文件。对于 Mac OS X Server,使用 Server Admin 将以下 MIME 类型添加到 MIME Types 设置: application/octet-stream ipa text/xml plist 对于 IIS,使用 IIS Manager 在服务器的 Properties 页面中添加 MIME 类型: .ipa 应用程序/八位字节流 .plist 文本/xml 此链接将对您有所帮助并解决您的问题@d2burke ios-programming.blogspot.in/2012/04/… 这也发生在我身上。遵循已接受答案中的所有步骤,但事实证明我的缩略图之一是 404。【参考方案4】:

另一个可能的问题是 .plist .ipa 都需要使用 HTTPS 托管,而不仅仅是常规 HTTP。软件包字符串应如下所示:

<key>kind</key>
<string>software-package</string>
<key>url</key>
<string>https://example.com/app.ipa</string>

愚蠢的小疏忽,但它让我绊倒了一段时间。

【讨论】:

【参考方案5】:

在尝试将 iOS 5+ 应用程序安装到 iOS4.3.5 手机时,我们确实遇到了同样的错误消息。 您是否还检查了部署/构建目标和目标架构以匹配显示该问题的设备?

【讨论】:

当我将我的代码签名身份切换为我的目标的分发时遇到了这个问题。当我为我的项目切换到分发时,它已修复。我不知道为什么这些不会被链接。【参考方案6】:

确保所有文件中的大小写匹配。它们往往不区分大小写。

【讨论】:

【参考方案7】:

在我的情况下,问题出在我的设备上,同一应用程序的旧版本安装了相同的捆绑标识符(从 applstore 下载),所以现在当我尝试通过企业分发下载其新版本时,它什么也没做,没有错误一点也不。从设备中删除现有版本解决了我的问题。

【讨论】:

【参考方案8】:

我在控制台中找到了。

安装协调(移动安装)[99]: ****bundleID****:5:11:1:1:更新占位符元数据 ****bundleID**** 失败 1 _LSInstallType 1,underlyingError (Error Domain=MIInstallerErrorDomain Code=13 "验证码失败 的签名 /private/var/installd/Library/Caches/com.apple.mobile.installd.staging/temp.IoCSM9/extracted/Payload/App.app :0xe8008016(可执行文件的签名无效。)“ UserInfo=LibMISErrorNumber=-402620394, LegacyErrorString=ApplicationVerificationFailed,SourceFileLine=147, 函数名=+[MICodeSigningVerifier _validateSignatureAndCopyInfoForURL:withOptions:error:], NSLocalizedDescription=验证代码签名失败 /private/var/installd/Library/Caches/com.apple.mobile.installd.staging/temp.IoCSM9/extracted/Payload/App.app :0xe8008016(可执行文件的签名无效。)), 来源 17>

这里我们应该看看:验证App.app的代码签名失败 可执行文件的签名无效。

就我而言,这是因为我从亚马逊下载了企业版。但是用于构建它的配置文件已过期(在developer console 中找到)。


另一个目的是:

“此时无法安装此应用。” UserInfo=NSLocalizedDescription=此应用程序无法安装在 这次,NSUnderlyingError=0x100cbd3c0 错误 Domain=MIInstallerErrorDomain Code=64 "升级的 应用程序标识符授权字符串 (BBBUUUU.com.bundle.www) 与已安装应用程序的应用程序标识符字符串不匹配 (CCCEEEE.com.bundle.www);拒绝升级。” UserInfo=LegacyErrorString=MismatchedApplicationIdentifierEntitlement, FunctionName=-[MIInstallableBundle _validateApplicationIdentifierForNewBundleSigningInfo:error:], SourceFileLine=878, NSLocalizedDescription=Upgrade's 应用程序标识符授权字符串 (BBBUUUU.com.bundle.www) 与已安装应用程序的应用程序标识符字符串不匹配 (CCCEEEE.com.bundle.www);拒绝

在这里,我刚刚删除了该应用程序的早期版本。错误是,因为我更改了捆绑 ID 的团队,并且它使用以前的捆绑 ID 安装了应用程序。


打开控制台:

Xcode > Window > Devices 选择设备 用左下角的带有箭头的框展开控制台。

【讨论】:

【参考方案9】:

尝试在您的XCode.plist 文件中检查bundle identifier

【讨论】:

【参考方案10】:

在我的情况下,我在提供 ipa 共享链接后做了以下操作以摆脱“无法连接到 dl.dropboxusercontent”消息。 1. 从 plist 中删除 md5 部分 2.上传512*512和57*57的图片到drop box,并在plist的fill_size_image和display_image中提供共享链接。

【讨论】:

嗯? Dropbox 与此有什么关系? 捆绑包已在 Dropbox 上发布,【参考方案11】:

首先要检查的是您正在安装的设备是否具有适合您正在安装的应用程序的操作系统。例如,如果该应用是为 iOS 11 构建的,并且您的设备上装有 iOS 10,则该应用将安装,但您会看到此错误“无法下载应用程序”。

【讨论】:

【参考方案12】:

就我而言,FTP 文件夹和其中的文件(清单、ipa、图像)的文件权限不正确存在问题。检查他们是否有 775 (rwx) 并且 Owner/Group 是您的所有者。

设备控制台中的错误类似于“无法连接到 iTunes Store”或“bundleID 插图失败”或“加载占位符插图失败捆绑ID”。但这只是关于文件。

【讨论】:

以上是关于iOS 企业 OTA 分发无法下载应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在设备上安装配置证书以使用企业 iOS 帐户进行 OTA(无线)应用程序分发

通过OTA的方式在局域网分发iOS应用

ios 8 添加临时分发

OTA AdHoc 分发 - 如何从命令行构建 IPA?

iOS 10 测试版:无法从站点/url 安装企业分发版本

企业分发在 iPhone 4 上“无法下载应用程序”但在 iPhone5 上有效