【问题标题】:iOS 8 - Can't Install Enterprise AppiOS 8 - 无法安装企业应用程序
【发布时间】:2014-11-02 04:57:13
【问题描述】:

我们公司有一个应用程序,可以使用 Enterprise Distribution 通过网站下载。

在 iOS 8 Beta 5 中,点击下载链接会弹出预期的弹出窗口“(website) would like to install (App Name)”。在该对话框上点击“安装”首先会导致应用卡在“等待...”

直到最后提示:“Unable to Download App(应用名称)此时无法下载。”

使用 iOS 7 可以按预期进行安装。

在 iOS 8 下从 Xcode 运行应用程序有效。

我们如何支持企业分发 iOS 8?

也许需要对 Manifest 文件进行更改?当我尝试在 Xcode 6 Beta 7 中构建应用程序时,企业归档过程没有提示我制作清单文件...

【问题讨论】:

  • 我们得到了同样的东西,但它只本地化到我们最新的仅限 iOS7 的应用程序。这是我们正在积极尝试寻找解决方案的事情。这与我们签署应用程序的方式有关。
  • @WilliamGeorge 你说这只发生在你的 iOS 7 应用程序中。这是否意味着您使用 iOS 8 应用获得了不同的结果?
  • 不,我们部署目标为 iOS6+ 的 iOS 应用程序下载了一个已安装的罚款。我们的应用程序只有 iOS7 的部署目标 - 这可能是一个红鲱鱼 - 我们的应用程序虽然相似,但在放弃 iOS6 支持后发生了巨大变化。
  • 我也想知道它是否与清单文件有关,但我不知道如何在XCode 6中重新生成它。正如OP所说,xcode不会提示您生成清单文件就像在 xcode 5 中一样。
  • 遇到同样的问题,可以在任何 iOS7 设备上安装,但在所有 ios8 设备上都会出现错误。到目前为止,我已经尝试了此处列出的所有内容,更改了下载 url,进行了版本更改,使用 xcode 6 辞职,检查了 plist 中的图像,什么都没有。控制台根本没有显示任何错误,但没有显示安装失败的原因。我创建了一个苹果 TSI 并用尽了我的一个支持问题,希望能解决这个问题。还没有答案...但是当我得到回复时会在这里报告。

标签: ios iphone enterprise


【解决方案1】:

查看试图安装我的一个应用程序的手机控制台,我发现:

Sep  9 12:16:56 iPhone misagent[94] <Error>: attempt to install invalid profile: 0xe8008011
Sep  9 12:16:56 iPhone installd[40] <Error>: 0x100484000 -[MIInstallableBundle _installEmbeddedProfileInBundle:]: Could not install embedded profile: 0xe8008011 (Expired)

我不知道的原因是,Apple 使我的一半个人资料无效并且未能提醒我。进入 developer.apple.com 后发现任何无效的个人资料:

点击Edit - > Generate -> Download 使用新配置文件重建应用程序。

但是 - 坏消息仍然是我的至少一个应用程序无法安装。通过控制台查看什么都没有。我确信这是一个苹果错误,所以提交了一个雷达:17622725

我希望您的问题是个人资料问题,否则我们可能必须等到今晚 1800 GMT 才能查看苹果是否已修复它。

编辑

使用 iOS8 GM - 我刚收到 Waiting... - 我会及时通知您错误报告的进度。

编辑

故障排除后发现了一些修复:

修复 1

从 iOS8 开始,如果您在清单 plist 中链接到的图像不存在 - Apple 不会在手机上安装应用程序 - 清单是您在下载页面上链接到的文件:itms-services://?action=download-manifest&amp;url={url}

确保full-size-imagedisplay-image 都存在:

<dict>
    <key>kind</key>
    <string>full-size-image</string>
    <key>needs-shine</key>
    <true/>
    <key>url</key>
    <string>https://{path_to_real_image}</string>
</dict>
<dict>
    <key>kind</key>
    <string>display-image</string>
    <key>needs-shine</key>
    <true/>
    <key>url</key>
    <string>https://{path_to_real_image}</string>
</dict>

修复 2

如果以前存在于 iOS7 上的企业应用程序由于 iOS8 的错误而无法安装。控制台出现错误:

Ignore manifest download, already have bundleID: {bundle_id}

这可以通过临时更改清单文件中的bundleID 来解决,但苹果知道,因为他们将错误报告标记为重复。内部测试后,您还可以通过休息主屏幕布局来解决问题General -&gt; Reset -&gt; Reset Home Screen Layout

修复 3

如果您看到应用程序进入installing... 阶段而不是loading... 几乎可以肯定问题是embedded provisioning profile 已过期,要修复下载,您需要使用新的重新归档应用程序,更新配置文件。

修复 4

如果您看到应用程序进入installing... 阶段并且您的provisioning profile 有效 - 在连接到控制台的同时下载应用程序。 (Xcode 6 > Window > Devices > Bottom Left Button [v]),您可能会发现安装失败,Verification Stage Failed 会在下方出现错误消息。在我的情况下(Entitlements found that are not permitted by provisioning profile) - 对于此错误,请转到 developer.apple.com 并更新您的 App Identifier 以包含正确的服务。对我来说 App Groups 需要启用。然后重新生成你的provisioning profile

【讨论】:

  • 感谢您的回复。原来我确实有无效的配置文件,但重新生成它们并没有解决问题。还尝试了 iOS8 GM 并在 Xcode 6 GM 中构建应用程序。还没有运气。
  • 我想我找到了问题所在。我引用了我的 .plist 文件中不存在的图像。该应用程序可以在我的一台 iOS8 GM 设备上正常安装,但仍然无法安装在我的个人 iOS8 GM 设备上。您能否检查您的 plist 文件以查看您是否有错误的图像参考并报告?
  • 我没有丢失任何图像。但你让我明白了一点——我打开了OrganiserValidate..d 我的档案。我收到一条错误消息,说 Failed to locate or generate matching signing assets 这可能是我的问题的原因 - 我会在继续时通知您。
  • @WilliamGeorge 使用Reset Home Screen Layout 不走运。我只在我的个人手机上遇到了这个问题,我从备份中升级并恢复了它。可能是时候进行全新安装了。
  • Reset Home Screen Layout 似乎对“忽略清单下载,已经有 bundleID”错误没有影响。临时捆绑 id 修改 hack 确实有效。
【解决方案2】:

编辑:下面的问题是一个红鲱鱼。正如上面提到的 Dylan Hand 所说,对我来说,问题是我在清单文件中破坏了图像链接。显然这对 ios7 无关紧要,但如果这是真的,ios8 将不会完成安装。当我删除这些引用时,它工作得很好。


我的症状与 OP 相同(即“无法下载应用程序”消息,但仅在 iOS 8 上)。当我尝试验证(即 Organizer -> Validate)时,我收到以下消息。

这让我看到了这篇文章:https://stackoverflow.com/a/25757196/751136

它声称重新生成您的配置文件应该会产生一个名为beta-reports-active 的新权利。当我尝试在我的企业帐户中执行此操作时,新配置文件没有新权利。但是,当我在另一个非企业帐户中重新生成配置文件时,新的配置文件确实具有该字段。

【讨论】:

    【解决方案3】:

    我现在刚刚遇到这个问题,它是由 mainfest plist(键:全尺寸图像 + 显示图像)指向不存在的 url 图像位置引起的。

    如果图像不存在,iOS6/iOS7 似乎可以处理,但 iOS8 对此有更多限制。

    【讨论】:

      【解决方案4】:

      我今天遇到了同样的问题:我无法在 IOs8(但在 IOs7)上安装我的企业应用程序之一。 经过几个小时的搜索,我终于在设备控制台上看到了这条消息:

      <Warning>: LoadExternalDownloadManifestOperation: Ignore manifest download, already have bundleID: com.ecaste.Crew-Desk
      

      找了好久,终于看到了这篇文章: http://support.hockeyapp.net/discussions/problems/26683-not-able-to-download-apps-ios8-beta-5-autoupdate-manually-etc

      最后我只是更改了 plist 的名称和下载 ipa 的链接(可能不需要第二个),最后安装了应用程序。

      最后看来是 IOs8 的缓存问题,认为该应用已经安装(事实并非如此,我之前卸载了它)。

      希望有帮助

      【讨论】:

      • 您也可以在这里阅读:buildozer.io/ios8。但这与这个问题所涉及的问题不同,这是一个不同的错误。
      • 似乎我在更改 Bundle 标识符和清单文件时遇到了类似的问题,它似乎允许我在 iOS8 上安装我仍在测试其他一些位。看来我的下一个问题是 ipa 存储在 FTP 上,需要移动到 HTTPS
      • +1 用于提及设备控制台。这是寻找我的问题的第一个来源。我只需删除现有应用程序,然后成功安装新应用程序。
      【解决方案5】:

      基于之前关于“忽略清单下载”消息的 cmets,我们尝试将 .plist 中的捆绑 ID(即 com.companyName.AppName)更改为具有唯一名称,以强制 iOS 8 无论如何都下载/安装它.安装后,它会正确替换现有副本。

      我相信这里有两个问题。如果 https 网站上指向企业证书签名的 .ipa 文件的 .plist 具有与已安装的应用程序匹配的捆绑标识符,则不会覆盖它。我们所有的 .plist 文件的 bundle-version 都不同,所以无论如何它都应该安装它。 iOS 7 似乎没有这个问题。我们计划通过弄乱 plist 中的 bundle-identifier 来解决此问题,因此它始终是构建唯一的。

      第二个问题是,当它成功安装应用程序时,它并没有切换到主屏幕或表明它正在做任何事情。在 iOS 7 中,在提示符处选择“安装”按钮后,将切换到主屏幕,其中图标将变暗,并且进度指示器将显示下载进度。然后应用程序旁边会有一个蓝点,表示它是新的。在 iOS 8 中,它不会切换到主屏幕,因此它似乎无法正常工作。您可以手动转到主屏幕,您应该会看到一个带有进度指示器的黑色图标(现在位于新位置,因为它不知道它将替换现有应用程序)。成功下载/安装后,它不会在替换的应用程序上放置蓝点。

      希望这会有所帮助。

      【讨论】:

      • 对于第二个问题,如果您从应用程序启动 itms-services 链接,您可以使用以下命令使应用程序成为后台:[[UIApplication sharedApplication] performSelector:@selector(suspend)];
      • 当心,我对 iOS 9 的早期测试表明,如果 .plist 文件中的捆绑标识符与实际捆绑标识符不匹配,ipa 根本不会安装(这在 iOS 8 上确实有效)。
      【解决方案6】:

      如果您使用构建脚本构建您的 iOS 应用,并且您之前使用带有 --sign 标志的 PackageApplication,那么这可能会导致问题。在 10.10 上构建时,--sign 标志不再起作用并删除它会重新安装我们所有的 iOS 应用程序。

      见:https://devforums.apple.com/thread/251624?tstart=0

      【讨论】:

      • 谢谢,这其实也是我的情况。 --sign 参数似乎不是必需的(还有吗?)。
      【解决方案7】:

      这个问题把我逼疯了, 只有这有助于企业分发: 执行所有必需的构建设置,然后单击“存档”。执行企业分发流程。您将看到管理器窗口。在 Mac 机器上,通过选择 KRelease 并选择“在 finder 中显示”找到 .xcacrchive 文件。

      用户被导航到 .xcarchive 文件所在的文件夹。右键单击 .xcarchive 文件并选择“显示包内容”选项。

      在打开的查找器窗口中转到产品/应用程序 选择并复制 .app 文件

      在磁盘的某处创建一个名为“Payload”的新文件夹 注意:文件夹名称区分大小写。 将复制的 .app 文件粘贴到“Payload”文件夹中。 压缩 Payload 文件夹得到 Payload.zip 文件 将 Payload.zip 文件重命名为 .ipa 并将其与您的 .plist 捆绑在一起 完毕 !!! .ipa 文件已准备好安装在 .xcarchive 生成​​中使用的配置文件中注册的设备上。

      【讨论】:

        【解决方案8】:

        同样的错误,我尝试更改 bundle-id、bundle-version、plist... 但错误仍然存​​在。

        我知道这有点棘手,但这是唯一适合我的方法:

        http://support.hockeyapp.net/discussions/problems/30194-ios8-workaround-can-break-today-extension?full_site=1#comment_35141099

        1. 将设备连接到 Mac 或 PC
        2. 在 iTunes 中创建备份

        3. 安装 iExplorer:http://www.macroplant.com/iexplorer/

        4. 启动 iExplorer,然后选择演示模式

        5. 在左侧边栏中,选择媒体,然后打开下载文件夹, 并删除其中的所有文件

        6. 重启设备

        7. 打开下载页面并安装最新版本的应用

        确实,我省略了前两个步骤,并且效果很好:)

        希望对你有帮助

        【讨论】:

        • 这行得通,为了进一步完善它,您只需要删除下载文件夹下的 *.sqlitedb 文件。如果您拉取 sqlitedb 文件并查询“下载”表,则可以看到带有您不幸的应用程序 ID 的记录
        【解决方案9】:

        我已经解决了这个问题。

        1. 由于 Apple 已更改配置文件,请更新配置文件(文件 1)并将其复制到“有效负载/”中。
        2. 确保“Payload/”中有一个 Entitlements.plist(文件 2),并且此 plist 文件必须是由文本编辑器创建的 PLAIN TEXT
        3. 确保“Payload/”中有一个 Info.plist(文件 3),这是由 XCode 创建的;
        4. 将 Entitlements.plist(文件 4)复制到“Payload/”以外的任何其他位置。
        5. 确保文件 1-4 中的“Bundle identifier”应该相同。
        6. 使用此 Entitlements.plist(文件 4)重新签署 IPA 文件。

        你可以这样辞职

        codesign -fs "iPhone Distribution: Your Company Name" --entitlements=/Users/SenTR/Downloads/codesign/Entitlements.plist /Users/SenTR/Downloads/codesign/Payload/Your_Project_name.app
        

        Entitlements.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>application-identifier</key>
                <string>PREFIX.yourappBundleID</string>
                <key>aps-environment</key>
                <string>production</string>
                <key>get-task-allow</key>
                <false/>
                <key>keychain-access-groups</key>
                <array>
                    <string>PREFIX.yourappBundleID</string>
                </array>
            </dict>
        </plist>
        

        如果你懂中文,这会很有帮助。

        http://hennry.com/2015/03/fail-to-resign-ipa-since-ios8/

        【讨论】:

          【解决方案10】:

          这些答案是要检查的有效内容,但如果其他人像我一样尝试过它们但仍然遇到问题,make sure your app contains the proper plist setting that allows the exported archive to be compressed correctly让我们感到困惑,即使按照上述所有步骤操作也是如此。另外值得注意的是,关于确保网站的 plist 包含有效图像链接的答案似乎没有任何影响,至少对于我们使用 XCode 6.3 导出档案而言。无论这些链接是否正确,它都有效/无效。不过,让这些信息正确显然是个好主意。另一个有趣的注意事项是,如果我们使用 XCode 5 导出,ipa 的格式总是正确的(参见上面链接的 SO 文章);现在看来 XCode 6+ 对它很挑剔。

          【讨论】:

            【解决方案11】:

            我的问题通过删除所有构建的输出得到纠正,然后完全重建。

            【讨论】:

              【解决方案12】:

              这给我带来了巨大的痛苦。我需要在 MDM 解决方案之外的员工手机上安装一个新的应用程序 OTA。我似乎尝试了我在互联网上找到的所有可能的解决方案,但没有任何效果。我能得到的最接近的是应用程序进入“加载”阶段。我的解决方案花了一周的时间,尝试了不同的事情。我不确定哪个按哪个顺序起作用,哪个会起作用,但我就是这样做的:

              就我而言,我之前使用来自开发人员(而不是企业)帐户的配置文件构建了这个应用程序。在 Xcode 中,我更改了 Bundle Identifier 给它一个新名称,例如,它原本是 com.mydomain.myapp,变成了 com.mydomain.mysuperapp。

              确保应用中的代码签名有效并包含企业帐户的分发证书

              我使用了错误的配置文件(一个没有关联身份的配置文件),因为我选择了“自动”,所以它构建得很好,但永远不会安装。因此,我将 Release 的代码签名更改为我的分发配置文件(而不是开发配置文件)

              确保应用设置的部署目标足够低,可供设备下载

              存档文件并导出用于企业部署

              清单必须包含 57x57 png 和 512x512 png 图像,否则安装无法通过“等待”阶段

              我创建了一个如下所示的 index.html 文件:

              <html>
                  <body>
                      <a href="itms-services://?action=download-manifest&url=https://dl.dropboxusercontent.com/s/dw80wahlwupkyd5/MyApp.plist">
                          Install Learning Chunks App from Dropbox</a>
                  </body>
              </html>
              

              我使用了我在网上找到的 plist 示例,其中包含一些可选设置。当我把这些留在里面时,下载不起作用。我把那些拿出来了。我的清单 plist 文件名为:MyApp.plist,如下所示:

              <!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>https://dl.dropboxusercontent.com/s/r1bljbkcows7sje/mysuperapp.ipa</string>
                                  </dict>
                                  <dict>
                                      <key>kind</key>
                                      <string>display-image</string>
                                      <key>needs-shine</key>
                                      <true/>
                                      <key>url</key>
                            <string> https://dl.dropboxusercontent.com/s/ujk9ipcv2naltut/logo57.png</string>
                                  </dict>
                                  <dict>
                                      <key>kind</key>
                                      <string>full-size-image</string>
                                      <key>needs-shine</key>
                                      <true/>
                                      <key>url</key>
                                <string>https://dl.dropboxusercontent.com/s/gpebomok83mp9d5/logo512.png</string>
                                  </dict>
                          </array>
                          <key>metadata</key>
                              <dict>
                                  <key>bundle-identifier</key>
                                  <string>com.mydomain.mysuperapp</string>
                                  <key>bundle-version</key>
                                  <string>1.0</string>
                                  <key>kind</key>
                                  <string>software</string>
                                  <key>title</key>
                                  <string>My Super App</string>
                                  <key>subtitle</key>
                                  <string>My Super App</string>
                              </dict>
                      </dict>
                      </array>
                  </dict>
              </plist>
              

              我将 MyApp.plist、index.html、logo57.png、logo512.png 和 MyApp.ipa 上传到 DropBox。我将 index.html 分享给需要下载该应用程序的人。

              然后用户可以点击电子邮件中的共享链接,应用程序应该会安装。

              【讨论】:

                【解决方案13】:

                中设置较低的部署目标

                项目 > 构建设置 > iOS 部署目标

                目标 > 构建设置 > iOS 部署目标

                【讨论】:

                • 这正是我的问题。啊!
                【解决方案14】:

                此安装问题的另一个可能来源是项目和配置文件之间的大小写不匹配(尤其可能是自动或其他命令行构建)。捆绑包 ID 区分大小写。例如,如果配置文件中的应用程序包标识符是com.example.MyApp,并且项目配置和/或 Info.plist 使用 com.Example.Myapp,Xcode 7.1 将失败并出现代码签名错误或回退到通用配置文件(一个带有* bundle id,这本身可能是个问题)但xcodebuild 命令会成功。例如,Jenkins 还将错误签名的构建上传到 Hockeyapp。该版本将下载到客户端设备,但由于大小写不匹配而无法安装。

                因此,

                修复 0

                检查应用程序包标识符在项目和 Apple Developer 门户中的设置方式是否相同。

                避免此特定问题的最简单方法是始终在包标识符中使用小写字符。从 Apple Developer 门户复制捆绑包 ID 并将其粘贴到项目构建设置 (PRODUCT_BUNDLE_IDENTIFIER) 当然也有帮助。

                虽然我遇到了企业帐户的问题,但实际上它可能并不特定于这种类型的分发。

                修复 0´

                请务必查看名为 Installation Failure Troubleshooting for iOS 的 Apple 技术说明。

                【讨论】:

                  【解决方案15】:

                  我的问题是我的 ipa 文件名和 plist 中对该 ipa 的引用都有一个空格。删除两者中的空间允许安装

                  【讨论】:

                    猜你喜欢
                    • 2016-04-07
                    • 2020-12-02
                    • 2020-03-24
                    • 1970-01-01
                    • 2014-12-02
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-01-29
                    相关资源
                    最近更新 更多