我有一个应用程序和两个应用程序扩展(键盘和iMessage扩展),它们使用我们构建的三个框架。框架是项目的一部分,每个框架都有自己的目标。应用程序和扩展链接在这些框架中,我们使用它们来执行访问数据库等常见任务。
如果我们在AppDelegate中像这样初始化了Crashlytics
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool
{
Fabric.with([Crashlytics.self])
... more
}
然后它应该报告崩溃,即使崩溃发生在其中一个链接框架中,对吧? 如果应用程序,应用程序扩展和框架的dSYM文件存在,那么它应该能够将崩溃符号化到框架代码中,对吗?
我遇到一些困难让遇到崩溃的事情可靠地报告事情。如果我将Crashlytics.sharedinstance().crash()
放入主线代码中的函数中,那么它似乎工作正常。但是,如果我从这样的UIAlertAction中调用一个函数......
@objc func onPreviewLongPress(_ notification : Notification)
{
if let userInfo = notification.userInfo, let collectionName = userInfo["collectionName"] as! String? {
let alert = UIAlertController(title: "", message: "Enter the code:", preferredStyle: .alert)
alert.addTextField { (textField) in
textField.text = ""
}
alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: nil))
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { (_) in
let textField = alert.textFields![0]
// original code snipped
if textField.text!.doesContain("crash") {
self.callForCrash()
}
}))
self.present(alert, animated: true, completion: nil)
}
}
private func callForCrash() {
Crashlytics.sharedInstance().crash() // DOES NOT REPORT!!!
}
我还尝试通过强制除零来强制崩溃......
private func callForCrash() {
let nom = 12;
let result = nom / zeroNum(13)
print(result)
}
// separate function to allow division by zero to get through swift parsing
private func zeroNum(_ num: Int) -> Int {
return num - num;
}
这也没有报道。但是,如果我只是将Crashlytics.sharedInstance().crash()
放在警报之前的代码中,那么报告就好了。
@objc func onPreviewLongPress(_ notification : Notification)
{
if let userInfo = notification.userInfo, let collectionName = userInfo["collectionName"] as! String? {
let alert = UIAlertController(title: "", message: "Enter the code:", preferredStyle: .alert)
alert.addTextField { (textField) in
textField.text = ""
}
Crashlytics.sharedInstance().crash() // REPORTS JUST FINE HERE!
// of course we don't see the alert box in this case
alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: nil))
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { (_) in
let textField = alert.textFields![0]
if textField.text!.doesContain("crash") {
self.delayedCrash()
}
}))
self.present(alert, animated: true, completion: nil)
}
}
在过去的几天里,我已多次完成安装过程和示例代码。
任何人都可以看到我可能错过的内容吗?我读过一些关于arm64的问题,但这个问题已经过时了,所以我不确定这是不是一个问题。我可以在日志中查找一些可以告诉我它是否正常工作的内容吗? 更新是否可能同时使用相同ID的Android和iOS版本的应用,即' com.mydomain.myapp'可能会导致一些不可预测的行为?它在Fabric控制台上单独显示。
TIA,迈克
答案 0 :(得分:0)
我会继续发布这个作为答案,因为它确实报告了在框架中发生的崩溃,这是主要的一点。这只是一个部分答案,因为我也在谈论应用程序扩展。我已收到键盘扩展程序的报告,但到目前为止,iMessage扩展程序中没有任何报告。
无论如何,它确实似乎与框架一起使用。我选择了我们构建的一个框架并添加了这些函数:
public static func doCrash() {
func1()
}
private static func func1() {
func2()
}
private static func func2() {
let _ = 10 / prepNum(5)
}
private static func prepNum(_ int:Int) -> Int {
return int - int
}
当点击除零时,应用程序崩溃了,重新启动后,我收到了崩溃报告,内容如下:
libswiftCore.dylib
specialized _fatalErrorMessage(_:_:file:line:flags:) + 124
1 CommonKit _T012CommonKit9LocalFileC5func233_BC978A475DDB24483E4F12A335D91E70LLyyFZ + 136
2 CommonKit _T012CommonKit9LocalFileC5func133_BC978A475DDB24483E4F12A335D91E70LLyyFZ + 20
3 CommonKit _T012CommonKit9LocalFileC7doCrashyyFZ + 20
4 MyApp StickerViewController.swift line 369
StickerViewController.callFrameworkForCrash() -> ()
因此,它似乎无法完全符合框架中的崩溃。但是,如果我们查看结果_T012 CommonKit 9 LocalFile C7 doCrash yyFZ,我们可以提取崩溃CommonKit :: LocalFile的函数的名称.doCrash()。
我希望这有助于将来的某些人。我会继续尝试从iMessage扩展程序中获取一些东西。
麦克