Crashlytics在框架

时间:2017-12-08 21:49:41

标签: ios xcode crashlytics

我有一个应用程序和两个应用程序扩展(键盘和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)
    }
}

在过去的几天里,我已多次完成安装过程和示例代码。

  • 控制台显示我试图测试的版本,包括全新的内部版本号
  • 控制台未报告缺少dSYM文件的问题,
  • 我没有启用bitcode,
  • 我正在构建'仅限活动架构' =是(我也尝试将其设置为否),
  • 运行脚本适用于应用和两个应用扩展程序(我还没有尝试过测试扩展程序)
  • 我尝试从Xcode运行,然后在安装后停止启动,
  • 我还尝试通过设备窗口(Xcode 9.2)创建临时构建和安装
  • 我触发了崩溃,然后重新启动了应用,以便报告

任何人都可以看到我可能错过的内容吗?我读过一些关于arm64的问题,但这个问题已经过时了,所以我不确定这是不是一个问题。我可以在日志中查找一些可以告诉我它是否正常工作的内容吗? 更新是否可能同时使用相同ID的Android和iOS版本的应用,即' com.mydomain.myapp'可能会导致一些不可预测的行为?它在Fabric控制台上单独显示。

TIA,迈克

1 个答案:

答案 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扩展程序中获取一些东西。

麦克