如何手动让 ACRA 发送待定报告(离线使用)

How to manually have ACRA send pending reports (offline use)

我们的客户 95% 的时间都在离线使用我们的移动应用程序。在一天的工作结束后,当他们回到办公室时,他们会在有网络连接的情况下将所有数据与我们的服务器同步。

我们已使用 AcraHttpSender 插件设置 ACRA 以尝试直接向我们发送崩溃报告,但这通常会失败,因为他们正在离线使用应用程序,而 ACRA 会存储报告。

据我了解,只有当应用程序 重新启动 到 ACRA.init 时,ACRA 才会发送待处理的报告。问题是用户没有理由在他们的工作日结束时重新启动应用程序(当他们有网络连接时)。我必须强调,用户完全是技术文盲,我们的客户向我们明确表示了这一点。

因此,我们确实需要能够告诉 ACRA 在网络连接可用的短时间内向我们发送任何未决的崩溃报告。没有任何类型的用户交互。我在想也许在我们的主要 activity.

的 onCreate 函数中

但是我一直在查看文档和其他人问同样的问题一段时间,但没有发现任何明显的问题。这可能吗?

编辑:这是根据@F43nd1r 和@CommonsWare 提出的建议的当前工作代码。它不适用于 5.4.0,但适用于 5.5.1。

Gradle

def acraVersion = '5.5.1'
implementation "ch.acra:acra-core-ktx:$acraVersion"
implementation "ch.acra:acra-http:$acraVersion"
implementation "ch.acra:acra-advanced-scheduler:$acraVersion"
implementation "ch.acra:acra-toast:$acraVersion"

初始化

    initAcra {
        setBuildConfigClass(BuildConfig::class.java)
        setReportFormat(StringFormat.JSON)
        plugin<ToastConfigurationBuilder> {
            setResText(R.string.acra_crash_text)
            setLength(Toast.LENGTH_LONG)
            setEnabled(true)
        }
        plugin<HttpSenderConfigurationBuilder> {
            setUri("${BuildConfig.protocol}://${BuildConfig.host}/${BuildConfig.codemrc}/acra")
            setHttpMethod(HttpSender.Method.POST)
            setBasicAuthLogin("acra")
            setBasicAuthPassword("******")
            setEnabled(true)
        }
        plugin<SchedulerConfigurationBuilder> {
            setRequiresNetworkType(JobInfo.NETWORK_TYPE_ANY)
            setRestartAfterCrash(true)
            setResReportSendSuccessToast(R.string.acra_report_sent_text)
            setEnabled(true)
        }
    }

    // Turn this on to obtain more messages in the log to debug ACRA
    ACRA.DEV_LOGGING = BuildConfig.DEBUG

正如@CommonsWare 在评论中所述,AdvancedSenderScheduler 是正确的选择。

用法示例:

implementation "ch.acra:acra-advanced-scheduler:5.5.1"
@AcraScheduler(requiresNetworkType = JobInfo.NETWORK_TYPE_UNMETERED,
               requiresBatteryNotLow = true)

如果您对 AdvancedSenderScheduler 选项不满意,您也可以注册自己的 SenderScheduler,但这很少是必要的。