iOS 8 - 无法安装企业应用程序

64

我们公司有一个应用程序,可以通过企业分发方式从网站上下载。

企业分发网站

在 iOS 8 Beta 5 上,点击下载链接会弹出期望的弹窗“(网站)想要安装(应用名称)”。但是,在该对话框上点击'安装'按钮后,应用程序会被卡在“等待…”状态。

应用程序卡在等待中

直到最终显示:“无法下载应用程序(应用名称)目前无法下载。”

无法下载应用程序

在 iOS 7 上使用安装预期正常工作。

从 Xcode 在 iOS 8 下运行该应用程序也能正常工作。

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

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


我们遇到了同样的问题,但只出现在我们最新的iOS7应用程序中。这是我们正在积极寻找解决方案的问题。这一定与我们签署应用程序的方式有关。 - William George
@WilliamGeorge,你说这只发生在你的iOS 7应用程序中。这是否意味着你在iOS 8应用程序中有不同的结果? - Dylan Hand
1
不,我们的iOS应用程序部署目标为iOS6+的下载和安装都很好。只有我们的部署目标为iOS7的应用程序出现了问题 - 尽管这可能是一个误导线索 - 我们的应用程序虽然相似,但自从放弃支持iOS6以来已经发生了巨大变化。 - William George
我也在想这是否与清单文件有关,但我不知道如何在XCode 6中重新生成它。正如楼主所说,Xcode不会像在Xcode 5中那样提示您生成清单文件。 - eremzeit
1
遇到了同样的问题,可以在任何iOS7设备上安装,但在所有iOS8设备上都会出现错误。到目前为止,我已经尝试了这里列出的所有方法,包括更改下载URL、版本更改、使用Xcode 6重新签名、检查图像的plist等等。控制台根本没有显示任何错误,只有一些警告,但没有任何线索说明为什么无法安装。我已经创建了一个苹果TSI并使用了我的支持问题之一,希望能解决这个问题。目前还没有答案...但是当我得到回复时,我会在这里报告。 - Joe
显示剩余5条评论
15个回答

63

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

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)

由于未知原因,苹果使一半的配置文件失效并没有通知我。在进入developer.apple.com查找无效的配置文件后:

点击 编辑 -> 生成 -> 下载 使用新配置文件重新构建应用程序。

然而,坏消息是我的某个应用仍然无法安装。通过控制台查看,我什么也没找到。我相信这是一个苹果的 bug,所以我已经提交了一个报告:17622725

我希望您的问题是一个配置文件问题,否则我们可能不得不等到今晚1800GMT看看苹果是否已经解决了它。

编辑

使用iOS8 GM - 我只看到 等待中... - 我会通过错误报告进展来通知您。

编辑

经过故障排除,发现了几个修复方法:

修复方案1

从iOS8开始,如果清单 plist 中链接到的图像不存在,苹果将无法在手机上安装该应用程序 - 清单是您在下载页面上链接到的文件:itms-services://?action=download-manifest&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

iOS8存在一个bug,导致企业应用程序在iOS7中已存在时无法安装。控制台会显示错误信息:

Ignore manifest download, already have bundleID: {bundle_id}

这个问题可以通过在清单文件中暂时更改bundleID来解决,但苹果公司已经意识到这个问题,并将其标记为重复。在内部测试后,您还可以通过重置主屏幕布局常规 -> 重置 -> 重置主屏幕布局来解决问题。

修复方法3

如果您看到应用程序进入正在安装...阶段而不是正在加载...,几乎肯定的问题是嵌入式配置文件已过期,要解决下载问题,您需要使用新的、更新的配置文件重新存档应用程序。

修复方法4

如果您看到应用程序进入正在安装...阶段,而且您的配置文件有效-请连接到控制台下载应用程序。(Xcode 6 > 窗口 > 设备 > 底部左侧按钮[v]),您很可能会发现安装失败,并显示验证阶段失败,下面有错误消息。在我的情况下,(发现与配置文件不允许的权限)-对于这个错误,请前往developer.apple.com并更新您的应用标识符以包括正确的服务。对我来说,需要启用应用组。然后重新生成您的配置文件.


谢谢您的回复。事实证明,我的配置文件确实无效,但重新生成它们并没有解决问题。我还尝试了iOS8 GM和在Xcode 6 GM中构建应用程序,但仍然没有运气。 - Dylan Hand
7
我想我找到了问题所在。我有一个指向<appname>.plist文件中不存在的图像的引用。该应用程序可以在我的一个iOS8 GM设备上成功安装,但仍无法在我的个人iOS8 GM设备上安装。您能否检查您的plist文件,看看是否有错误的图像引用,并报告给我? - Dylan Hand
Dylan的解决方案对我有用。我删除了指向图像的两个键,然后在iOS8上成功安装了它。我还将".ios8fix"后缀添加到清单的捆绑标识符中,但在删除这两个键之前,它并没有起作用。供参考。 - yc.lin
1
@WilliamGeorge,使用“重置主屏幕布局”没有成功。我只在我的个人手机上遇到了这个问题,因为我升级并从备份中恢复了数据。也许是时候进行一次清洁安装了。 - Dylan Hand
1
“Reset Home Screen Layout” 看起来对“忽略清单下载,已经有 bundleID”错误没有影响。临时的 bundle id 操纵 hack 是有效的。 - Warren
显示剩余9条评论

7

我也遇到了同样的错误,我已经尝试更改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. 在左侧边栏中选择Media,然后打开Downloads文件夹,并删除其中的所有文件

  6. 重新启动设备

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

事实上,我省略了前两个步骤,它完美地工作了 :)

希望这能帮到你


1
这个方法是有效的,如果你想要更加完善它,只需要删除下载文件夹下的*.sqlitedb文件即可。如果你提取了sqlitedb文件并查询“downloads”表,就可以看到一个包含你不幸应用程序ID的记录。 - Padmika

7
今天我遇到了同样的问题:我无法在iOS 8上安装我的企业应用程序(但在iOS 7上可以)。经过长时间的搜索,我最终读取了设备控制台上的此消息:
<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中的缓存问题,它认为应用程序已经安装(但事实并非如此,我之前已经卸载了它)。
希望这能帮到你。

您也可以在此处阅读相关信息:https://buildozer.io/ios8。但这与本问题不同,这是一个不同的错误。 - Andreas Paulsson
1
似乎我和你遇到了类似的问题,一旦我更改了Bundle标识符和清单文件,似乎就可以在iOS8上安装。我仍在测试其他一些部分。下一个问题似乎是我的ipa存储在FTP上,需要转移到HTTPS。 - Grenter
+1 提及设备控制台。这是我解决问题的第一来源。我只需删除现有应用程序,然后成功安装新应用程序。 - Seto

6

在项目 > 构建设置 > iOS 部署目标中将部署目标降低

在目标 > 构建设置 > iOS 部署目标中将部署目标降低


2
那正是我的问题。啊! - mkto

3

根据之前关于“忽略清单下载”消息的评论,我们尝试更改.plist中的束标识符(即com.companyName.AppName)以便具有唯一名称,从而强制iOS 8进行下载/安装。 安装完成后,它会正确地替换现有的副本。

我认为这里存在两个问题。如果指向企业证书签名的.ipa文件的https网站上的.plist具有与已安装应用程序匹配的束标识符,则不会覆盖它。 我们所有的.plist文件的束版本都是不同的,因此它应该无论如何都可以安装。 iOS 7似乎没有这个问题。 我们计划通过在plist中捣乱束标识符来解决此问题,使其始终对构建唯一。

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

希望这可以帮助。


对于第二个问题,如果您正在从应用程序启动itms-services链接,则可以使用以下方法将应用程序置于后台:[[UIApplication sharedApplication] performSelector:@selector(suspend)]; - wottle
1
注意了,我的iOS 9早期测试显示,如果.plist文件中的bundle-identifier与实际的bundle标识符不匹配,则ipa根本无法安装(这在iOS 8上是可以的)。 - Andreas Paulsson

3
我刚刚遇到了这个问题,它是由于主清单plist(键:full-size-image + display-image)指向不存在的url图像位置引起的。 看起来iOS6/iOS7可以处理如果图像不存在,但iOS8对此更加严格。

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

在我的情况下,我以前使用了开发者(而不是企业)帐户的配置文件构建了这个应用程序。在Xcode中,我更改了Bundle标识符,以给它一个新名称,例如,它最初是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 分享给需要下载应用程序的人。

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


1
如果您使用构建脚本构建iOS应用程序,并且以前使用了PackageApplication和--sign标志,则可能会导致问题。当在10.10上进行构建时,--sign标志不再起作用,删除它可以使我们所有的iOS应用程序重新安装。
请参见:https://devforums.apple.com/thread/251624?tstart=0

谢谢,这其实也是我的情况。--sign参数似乎不再必要了? - Oscar Hierro

1

编辑:下面的问题是一个误导。正如Dylan Hand上述提到的,我的问题在于清单文件中有损坏的图像链接。显然,这对于ios7无关紧要,但如果是真的,ios8不会完成安装。当我删除了那些引用时,它完美地工作了。


我有和OP一样的症状(即在iOS 8上只出现“无法下载应用程序”的消息)。当我尝试验证(即使用Organizer -> Validate)时,我收到了以下消息。

Screenshot of the result of validation

这使我想到了这篇文章:https://dev59.com/Hl8e5IYBdhLWcg3wcJ8q#25757196 文章称重新生成您的配置文件应该会产生一个名为beta-reports-active的新授权。当我在我的企业账户上尝试这样做时,新的配置文件没有这个新授权。但是,当我在另一个非企业账户中重新生成配置文件时,新的配置文件确实有这个字段。

1
这个问题让我很烦恼, 只有企业分发使用以下方法才有效: 执行所有所需的生成设置并单击“存档”。执行企业分发流程。您将看到组织器窗口。在Mac机器上,通过选择KRelease并选择“在查找器中显示”来查找.xcacrchive文件。
用户被导航到包含.xcarchive文件的文件夹。右键单击.xcarchive文件并选择“显示包内容”选项。
在打开的搜索器窗口中转到Products / Applications 选择并复制.app文件
在磁盘的某个位置创建一个名为“Payload”的新文件夹。注意:文件夹名称区分大小写。 将已复制的.app文件粘贴到“Payload”文件夹中。 压缩Payload文件夹以获取Payload.zip文件 将Payload.zip文件重命名为.ipa,并与您的.plist捆绑在一起 完成!准备好在.xcarchive生成中使用的配置文件中注册的设备上安装.ipa文件。

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