为什么使用开发或企业证书签名的iOS应用程序启动较慢?

19

我注意到在我的iPhone 5上,使用我的开发证书和公司的企业分发证书签署的应用程序启动或激活需要约4秒钟。这是从点击应用程序图标到看到启动图像所需的时间 - 这显然不包括应用程序的初始化代码。

这是一个尴尬的4秒钟,在此期间应用程序的图标在被点击后保持暗淡,并且主屏幕会冻结(甚至不能向右/左滚动)。

奇怪的是,从后台重新激活应用程序(即启动应用程序,等待它运行,按Home键,然后立即再次点击应用程序的图标)需要大约相同的时间

问题如下:

  • 这是什么原因?
    • 我直觉认为是Springboard在每次点击应用程序图标时都试图验证签名证书。但我无法证明这一点。
  • 如果可能的话,如何减少这种启动冻结时间?

我在iPhone 5上使用iOS 8.3进行了测试。


1
我也注意到了,但不完全是4秒。也许提交一个雷达反馈会有所帮助。 - Andrew
编译用于分发的时候会使用更多的编译时优化,而不是用于开发的时候。但由于这种延迟在开发和企业部署中都可能被注意到,因此这不太可能是原因。 - Andrew
我遇到了相同的问题。一开始并没有意识到是因为企业版(一开始我以为可能是设备有问题或者太旧而无法支持最新的操作系统)。我尝试构建最简单的应用程序(单个视图),然后完全删除了Storyboard(没有视图),然后编辑方案,将其设置为“Release”配置(而不是“Debug”),但仍然没有作用。我很高兴找到了这个问题(即使到目前为止还没有明确的答案)。 - Nicolas Miari
5个回答

10

我认为这是由于设备上安装了大量不同的配置文件(因为某种原因,“设置”应用中的“配置文件”条目不再可用...但它们在 Window / Devices / Show Provisioning Profiles... 中显示)。

理论上,您应该从Xcode的“设备”窗口中删除所有配置文件。然而,在我的环境中至少到Xcode 6为止,这非常不响应(无论是点击菜单按钮还是按Delete键),甚至几乎停止工作,而且显示的列表本身有时似乎从一个连接设备到下一个设备之间存在很大的不一致性(可能是缓存?Xcode的bug?)。


太长没看:

所以,我只需将我的设备重置为出厂设置("删除所有设置和数据"),现在我的应用程序立即启动(iPad Air)并且几乎立即启动(iPod Touch第五代)。

我认为(但需要确认),之所以首先在设备上安装了所有这些配置文件,是因为在目标的 General/Identity 窗格中指定了“Team”。现在,我有以下设置:

  1. Target / General / Identity

    Bundle Ientifier:com.MyCompanyName.AppName

    Team:None

(设置团队似乎会导致Xcode将开发者门户中的所有配置文件都安装到设备上...?)

  1. Target / Build Settings / Code Signing

    Code Signing Identity:iOS Developer

    Provisioning Profile:Automatic

...并且在运行时,只有一个我的配置文件(由Xcode管理的“iOS Team Provisioning Profile”之一)被安装到设备上。

补充: 在互联网上搜索“Xcode specify team why”可以找到苹果公司关于设置Xcode团队的文档页面,希望能够有所帮助。


更新: 截至Xcode 7.x版本仍然保持不变。


顺便提一下,在iPad上,我的应用程序启动时间从4秒多降至“和工厂应用程序(如Safari等)一样快”。此外,在调试时经常出现的超时/启动失败/Springboard崩溃问题神奇地消失了。但在旧款iPod touch上,启动我的应用程序仍需要大约半秒钟的时间。 - Nicolas Miari
我似乎找不到 Xcode 6.4 的“设备”窗口中的配置文件列表。 - adib
1
在列表的设备行上右键单击(左侧窗格),然后再次右键单击(或者,点击底部的齿轮按钮)。然后选择“显示配置文件”。 - Nicolas Miari
请翻译以下与编程相关的内容,从英文到中文。只返回翻译后的文本:(如果您的Mac设置为单按钮鼠标,请使用ctrl + 单击代替右键单击) - Nicolas Miari
我把手机恢复出厂设置了,但那些个人资料却神奇地又回来了——尽管我没有在上面运行任何开发应用程序,也没有从备份中恢复。我只是登录了iCloud并将其插入iTunes以创建新的备份。有什么提示可以防止这些个人资料再次出现吗? - adib
显示剩余3条评论

10

删除设备上所有重复的配置文件。您可以在 Xcode-> 设备 中执行此操作,然后右键单击您的设备“显示配置文件...”。在我的情况下,我安装了超过 300 个不同的配置文件。

再次部署后,我的应用程序立即启动,而不是每次等待 5-8 秒钟。


2
这对我也有用。注意你设备上的“右键单击”。花了我一分钟才找到在哪里找到“显示配置文件”。 - Antoine
它对我有效,但我有一个疑问:重复的配置文件如何影响我的应用启动时间?因为应用程序已使用当前配置文件进行签名,并且应该仅检查此配置文件而不是其他重复的配置文件。我对它的影响感到困惑。 - Kalaivani

2
这段文本的翻译如下:

设备是否在检查非应用商店构建与证书吊销列表的匹配?而该列表可能在线

如果后者是真的,那么启用飞行模式可能会使启动更快。


1
飞行模式下仍然存在延迟。 - adib
1
那是我最好的猜测。它似乎很奇怪,它每次都会检查签名。您可以尝试计时较大的二进制启动时间... - Rhythmic Fistman
1
我的设备没有蜂窝网络连接(iPad、iPod Touch),也没有连接任何WiFi网络,所以一切都是离线进行的。我尝试从我的Mac创建一个WiFi网络并共享它。现在这些设备有了WiFi,但启动仍然需要大约4秒钟(没有改变)。飞行模式在这里也不起作用。 - Nicolas Miari

0

我在我的应用程序中遇到了类似的问题。我正在使用Parse和FBLogin。我尝试了这个页面上的所有方法。然后我尝试关闭Appdelegate中的所有启动选项并删除Assets.xcassets文件夹,但是没有成功。最后,我备份了我的info.plist文件,并从一个我知道可以正常启动的应用程序中复制了一个plist文件。这解决了问题。 然后我回去重新创建了包含旧plist内容的plist文件。我意识到App Transport Security Settings和LSApplicationQueriesSchemes是导致问题的原因。 现在应用程序在没有这些条目的情况下运行良好,但如果需要的话,我以后会添加它们。


0

我也遇到了这个问题,但我的设备(iPad)上没有重复的配置文件。后来我发现是OCSP导致了启动延迟。

甚至苹果在(证书验证)中也说:

“OCSP响应会在设备上缓存一段时间,该时间由OCSP服务器指定,目前为3至7天。”

但是OCSP出现的时间只有几个小时。


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