建议

SuggestStore 的 API 可以参见 MozillaComponents Kotlin 文档

注意

请确保为该组件初始化 Viaduct

警告

SuggestStore 是同步的,这意味着它需要包装在您正在使用的目标语言的异步原语中。

设置存储

您需要导入以下一个或多个原语来使用 SuggestStore(这些来自由 uniffi 生成的 suggest.kt 文件)

import mozilla.appservices.remotesettings.RemoteSettingsServer
import mozilla.appservices.suggest.SuggestApiException
import mozilla.appservices.suggest.SuggestIngestionConstraints
import mozilla.appservices.suggest.SuggestStore
import mozilla.appservices.suggest.SuggestStoreBuilder
import mozilla.appservices.suggest.Suggestion
import mozilla.appservices.suggest.SuggestionQuery
import MozillaAppServices

创建一个 SuggestStore 作为单例。您可以通过 SuggestStoreBuilder 来实现,它会返回一个 SuggestStore。在构建过程中不会执行任何 I/O 或网络请求,这使得它可以在应用程序启动的任何时间安全地执行。

internal val store: SuggestStore = {
    SuggestStoreBuilder()
        .dataPath(context.getDatabasePath(DATABASE_NAME).absolutePath)
        .remoteSettingsServer(remoteSettingsServer)
        .build()
let store: SuggestStore = {
    let storeBuilder = SuggestStoreBuilder()
    storeBuilder.dataPath(context.getDatabasePath(DATABASE_NAME).absolutePath)
    storeBuilder.remoteSettingsServer(remoteSettingsServer)
    return storeBuilder.build()
}
  • 您需要设置 dataPath,它是存储建议的路径(SQLite 位置)。

  • remoteSettingsServer 仅在您希望将服务器设置为除 prod 之外的其他任何内容时才需要。如果是这样,您需要传递一个 RemoteSettingsServer 对象。

导入建议

导入建议有两种不同的方式:启动时,然后在后台定期执行。

  • SuggestIngestionConstraints 用于控制导入的内容。

  • 使用 providers 字段通过提供程序类型限制导入。

  • 使用 providerConstraints 字段添加其他约束,目前仅用于曝光建议。

启动时

在每次启动后不久,使用 SuggestIngestionConstraints(emptyOnly=true) 导入。这确保我们在第一次运行以及升级后(我们通常会清除数据库以从头开始)时在数据库中有一些内容。

store.value.ingest(SuggestIngestionConstraints(
    emptyOnly = true,
    providers = listOf(SuggestionProvider.AMP_MOBILE, SuggestionProvider.WIKIPEDIA, SuggestionProvider.WEATHER)
))
store.value.ingest(SuggestIngestionConstraints(
    emptyOnly: true,
    providers: [.AMP_MOBILE, .WIKIPEDIA, .WEATHER]
))

定期

按照定期计划(例如每天一次)使用 SuggestIngestionConstraints(emptyOnly=false) 导入。

store.value.ingest(SuggestIngestionConstraints(emptyOnly = false))
store.value.ingest(SuggestIngestionConstraints(emptyOnly: false))

查询建议

调用 SuggestStore::query 以获取建议栏的建议。providers 参数应与传递给 ingest() 的值相同。

store.value.query(
    SuggestionQuery(
        keyword = text,
        providers = listOf(SuggestionProvider.AMP_MOBILE, SuggestionProvider.WIKIPEDIA, SuggestionProvider.WEATHER),
        limit = MAX_NUM_OF_FIREFOX_SUGGESTIONS,
    ),
)
store.value.query(
    SuggestionQuery(
        keyword: text,
        providers: [.AMP_MOBILE, .WIKIPEDIA, .WEATHER],
        limit: MAX_NUM_OF_FIREFOX_SUGGESTIONS
    )
)

中断查询

使用 InterruptKind::Read 调用 SuggestStore::Interrupt 以在用户取消查询并在运行下一个查询之前中断任何正在进行的查询。

store.value.interrupt()
store.value.interrupt()

关闭存储

在关闭时,使用 InterruptKind::ReadWrite 调用 SuggestStore::Interrupt 以中断任何正在进行的导入和查询。

store.value.interrupt()
store.value.interrupt()