【问题标题】:Swift HockeyApp: Custom crash log not shown on consoleSwift HockeyApp:控制台上未显示自定义崩溃日志
【发布时间】:2019-09-14 13:43:09
【问题描述】:

我正在探索将崩溃日志上传到 HockeyApp,但崩溃日志没有显示在 HockeyApp 的控制台面板上。

崩溃日志的格式是从他们的website 上的演示代码中复制而来,并修改为PackageCrashReporter Key

Package: //Bundle ID as shown on HockeyApp console
Version: 1.3
OS: Mac OS X 10.14.2 (18C54)
Manufacturer: Apple
Model: MacBookPro12,1
Date: Wed Apr 24 15:35:08 GMT+08:00 2019
CrashReporter Key: //Incident key generated in the crash log

java.lang.RuntimeException: Unable to start activity ComponentInfo\{de.codenauts.hockeyapp/de.codenauts.hockeyapp.MainActivity\}: java.lang.NullPointerException
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2787)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803)
  at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4066)
  at android.app.ActivityThread.access$2400(ActivityThread.java:135)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2140)
  at android.os.Handler.dispatchMessage(Handler.java:99)
  at android.os.Looper.loop(Looper.java:144)
  ...

这个post 提示date 字段可能有误,但我已经根据演示代码进行了调整,所以我想应该没问题。

这个post 还建议检查版本字段。 HockeyApp 上可用的版本如下所示,我的目标是 1.3 版:

我尝试了1.31.3(3)3,但似乎都不起作用。

我的 POST 请求返回一个 statusCode 创建的 201,所以我想网络请求是成功的。我错过了什么吗?

编辑:POST 功能

这是我用来上传自定义崩溃报告的 POST 函数。

func postLog(filename: String) {
    let urlString = "https://rink.hockeyapp.net/api/2/apps/APP_ID/crashes/upload"
    guard let url = URL(string: urlString) else {return}

    guard let filepath = Bundle.main.url(forResource: filename, withExtension: nil) else {
        print("Filepath nil")
        return
    }

    let fileData = NSData(contentsOf: filepath)

    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    let boundary = "Boundary-\(UUID().uuidString)"
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
    request.httpBody = createBody(parameters: [:], boundary: boundary, data: fileData! as Data, mimeType: "text/plain", filename: filename)

    let dataTask = session.dataTask(with: request) { (data, response, error) in
        if let error = error {
            print(error.localizedDescription)
            return
        }

        if let response = response {
            print(response)
        }
    }

    dataTask.resume()

}

【问题讨论】:

  • 我不确定将java stacktrace添加到iOS崩溃报告是否有效,我猜statuscode 201仅表示他们已收到崩溃报告,他们稍后会处理它(那么它可能从您的描述中失败)。但是,如果您正在测试发送自定义崩溃报告的可行性,是否可以下载原始 iOS 崩溃报告并进行所需的更改(Package/Version/CrashReporterKey...)然后尝试再次发送?
  • @AlickPann 那是我最初的尝试。我试图上传从我的 iPhone 生成的崩溃日志,但它没有成功上传。所以我退后一步尝试了他们的demo崩溃报告,同样没有上传成功,并给出了相同的statusCode 201
  • @Koh 嘿!我在 HockeyApp 上工作。如果您愿意,您可以使用您的 App ID 向我们发送支持请求,我们可以查看问题所在。
  • @LukasSpieß 好的,我已经向 hockey 发送了支持请求。

标签: swift hockeyapp


【解决方案1】:

联系 HockeyApp 支持后,问题出在 createBody 函数上。

name 参数需要为log 而不是file

func createBody(parameters: [String: String],
                boundary: String,
                data: Data,
                mimeType: String,
                filename: String) -> Data {
    let body = NSMutableData()

    let boundaryPrefix = "--\(boundary)\r\n"

    for (key, value) in parameters {
        body.appendString(boundaryPrefix)
        body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
        body.appendString("\(value)\r\n")
    }

    body.appendString(boundaryPrefix)

    //Problem was on this line, previously it was name=\"file\". After changing to log, it worked
    body.appendString("Content-Disposition: form-data; name=\"log\"; filename=\"\(filename)\"\r\n")

    body.appendString("Content-Type: \(mimeType)\r\n\r\n")
    body.append(data)
    body.appendString("\r\n")
    body.appendString("--".appending(boundary.appending("--")))

    return body as Data
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 2020-12-27
    • 2020-01-03
    • 2020-05-26
    • 1970-01-01
    相关资源
    最近更新 更多