Перейти к содержимому

Crash мобильного клиента

В соло-разработке настраивать Firebase Crashlytics ради 10 пользователей неоправданно. Достаточно прокинуть try/catch в самой верхней точке приложения — и POST в Notifly:

Application.onCreate
Thread.setDefaultUncaughtExceptionHandler { t, e ->
val sw = StringWriter().also { e.printStackTrace(PrintWriter(it)) }
OkHttpClient().newCall(
Request.Builder()
.url("$NOTIFLY_URL/message?token=$TOKEN")
.post(JSONObject(mapOf(
"title" to "📱 Crash: ${e.javaClass.simpleName}",
"message" to "Build: $VERSION_CODE\nDevice: ${Build.MODEL}\n\n${sw.toString().take(1500)}",
"priority" to 10,
)).toString().toRequestBody("application/json".toMediaType()))
.build()
).execute()
System.exit(2)
}
// iOS / Swift
NSSetUncaughtExceptionHandler { exception in
let body: [String: Any] = [
"title": "📱 iOS crash: \(exception.name.rawValue)",
"message": "Build: \(Bundle.main.infoDictionary?["CFBundleVersion"] ?? "?")\n\n\(exception.callStackSymbols.joined(separator: "\n"))",
"priority": 10,
]
var req = URLRequest(url: URL(string: "\(notiflyURL)/message?token=\(token)")!)
req.httpMethod = "POST"
req.httpBody = try? JSONSerialization.data(withJSONObject: body)
URLSession.shared.dataTask(with: req).resume()
sleep(1)
}

В push кладите Build, Device, OS version и первые 30 фреймов стектрейса — этого почти всегда хватает, чтобы понять проблему без UI.