具有 Objective-C 和 swift 代码的应用程序在发布模式下启动时崩溃,调试模式正常
Posted
技术标签:
【中文标题】具有 Objective-C 和 swift 代码的应用程序在发布模式下启动时崩溃,调试模式正常【英文标题】:app with Objective-C and swift code crash at launch in release mode, debug mode fine 【发布时间】:2015-06-16 12:32:12 【问题描述】:我的项目是基于 Objective-C 的,并且有一些第三方 swift 代码。
应用程序在调试模式下运行良好,但是,当我将应用程序归档为发布模式时,应用程序将在启动屏幕上崩溃。
将 swift 优化级别设置为 None 仍然有同样的问题。我安装了 crashlytics 3.7,但它在启动时崩溃,它没有机会上传崩溃。我很绝望。有什么想法吗?
更新:
我试图删除所有快速的东西和存档,现在一切都照常了。但是,一旦我将 swift 文件拖到基于 Objective-C 的项目中,运行(调试)应用程序就可以了。但是如果归档(发布)并将其安装在 iPhone 上,启动时会立即崩溃。有什么我想念的吗?
【问题讨论】:
设备日志说什么? 你可以在 GitHub 上发布你的项目吗? 我的应用已上传下载,所以我没有日志。但是您提醒我将调试模式设置为发布模式进行测试。抱歉,我无法发布项目。坚持 如果您打开 Xcode 的“设备”窗口并查看那里的设备日志,它会显示更有趣的内容吗? 我尝试将run设置为release config,但是Xcode只说:process launch failed: failed to get the task for process 44081.我没找到日志,太多了 【参考方案1】:好的,经过数千次归档和测试,我发现这是由内部分发引起的。
它正在证书中发送一个属性“OU”。我不得不重新创建一个新证书,现在它那里有“OU”。在处理采用 swift 代码的旧项目时,Apple 似乎根本没有提及它。
引用Enterprise Distribution not playing nice with ios8 in Swift App
本文详细解释:
https://www.airsignapp.com/ios-apps-using-swift-crash-when-signed-with-inhouse-certificate/
We can confirm that after create a new cert and .mobileprovision, no more issues.
We found origins that caused this issue, related to a missing attribute in “Subject” field InHouse Certificates :
BEFORE Subject: UID=269J2W3P2L, CN=iPhone Distribution: Company Name, O=Company Name, C=FR
AFTER Subject: UID=269J2W3P2L, CN=iPhone Distribution: Company Name, OU=269J2W3P2L, O=Company Name, C=FR
【讨论】:
在花了一整天的时间将发布问题缩小到将 swift 引入目标 c 应用程序的变化之后,我终于看到了这篇文章。 Xcode 在尝试启动企业发行版构建时显示此警报,“进程启动失败:等待应用程序启动超时”。这个答案解决了它。谢谢。 你能分享我如何检查证书的内容吗?即使重新生成证书和配置文件,我也面临同样的问题。 我非常希望这能解决我的问题,即目标 c 应用程序现在在添加 swift 代码后发布版本崩溃。不幸的是,我已经使用上面链接中的openssl x509 -in ~/Desktop/dist.cer -inform DER -text -noout | grep Subject:
检查了证书,并且 OU 确实存在于我的证书中。搜索继续。【参考方案2】:
我会发布这是一个答案,因为我没有代表发布 cmets。我有类似的问题,虽然与 Swift 无关。不过可能值得一试。
对我来说,问题与 Xcode 中的文件删除有关。我从 Xcode 项目中删除了一些文件,但它们仍然存在于我硬盘上的文件夹中。当通过 Xcode 运行项目时,它会加载这些文件,就好像它们是项目的一部分一样,但在归档时它不会包含它们。这使得应用程序在通过 Xcode 运行时可以完美运行,但在运行存档版本时会崩溃,因为它试图加载不存在的内容。
所以,要检查的一件事是启动应用程序时应加载的文件在 Xcode 的项目导航器中可见。希望对您有所帮助!
【讨论】:
我不知道是否有办法自动检查它,但是您可以通过 AppDelegate 和初始类查看正在加载的文件,并确保它们是项目的一部分(在项目导航器(cmd+1 将其打开)或在构建阶段的复制捆绑资源部分中)。 我的应用程序一直在发布模式下工作。这次我只是添加了一些快速代码,它在启动时崩溃了。我想也许不是你的情况 是的,听起来不一样。 你看过这个吗? ***.com/questions/28512096/… 我的视图控制器在 Objective-C 中。我不确定是否相关,因为我没有日志...以上是关于具有 Objective-C 和 swift 代码的应用程序在发布模式下启动时崩溃,调试模式正常的主要内容,如果未能解决你的问题,请参考以下文章
Swift - 带有Objective-C选择器'*'的方法'*()'与具有相同Objective-C选择器的超类'UIView'中的'*'的getter冲突
将 Swift 类添加到具有多个目标的 Objective-C 项目
如何在 Swift 中覆盖 Objective-c 类函数?
Cocoapod使用Mix和Match Swift和Objective-c代码
如何从具有隐藏变量名称(参数前的_)或内部+外部(例如 foo(with bar:))的 Objective-C 调用 Swift 函数