是否可以使用 AWS AppSync 构建离线优先的移动应用程序?

Posted

技术标签:

【中文标题】是否可以使用 AWS AppSync 构建离线优先的移动应用程序?【英文标题】:Is it possible to build offline-first mobile apps using AWS AppSync? 【发布时间】:2018-05-22 15:17:48 【问题描述】:

我想使用 AWS AppSync 进行移动开发 (android/ios),但我不确定它的离线功能。

根据文档,离线时可以访问数据,如果客户端再次在线,数据将自动同步。但在使用 AppSync 创建和修改离线数据之前,我找不到有关应用程序客户端是否需要先连接到 AWS 的任何信息。

我不熟悉 AppSync 的底层技术(例如 GraphQL),而且我无法访问公共预览版来自己测试它。

我想让对隐私敏感的用户能够在不连接到 AWS 的情况下使用应用程序,同时仍然能够将 AppSync 用作离线数据库。只有当用户后来决定跨设备使用备份/同步数据时,他或她才能选择连接到 AWS。

AWS AppSync 能否实现此用例?

不使用任何其他本地存储(如 SharedPreferences、SQLite、Realm 等)

【问题讨论】:

你能分享一些你想要达到同样效果的链接吗?你指的是这个吗? docs.microsoft.com/en-us/azure/app-service-mobile/… 感谢您的链接。是的,我想知道我是否可以使用 AWS AppSync 实现相同的(本地存储)。 Appsync 内部使用 SQLite 并将所有数据存储在单个表中。对于查询,您必须在客户端使用 graphQL 而不是基于 SQL/SQL 的 ORM。 【参考方案1】:

Firestore、AWS AppSync 或您自己的后端解决方案应该可以实现。您使用的任何方法都可以控制何时开始在线保存/同步内容。

您需要在设计此应用时处理所有这些问题。建议的方法

我们以简单的 ToDo 应用程序

为例

我会让用户在应用中添加和保存待办事项

所有这些数据都将保存在磁盘上(使用 SQLLITE、首选项或文件等)

如果用户清除数据或重新安装应用程序,所有这些数据都会丢失 如果用户想要付费,我会让他将此数据与我的后端解决方案(上述任何一种解决方案)同步

示例使用Android共享偏好作为本地存储实现

public void saveLocalTodo(String title, String details) 
    ArrayList<Todo> todos;
    Todo todo = new Todo(title, details);
    String listOfTodo = sharedPreference.getString(TODOS_LIST, null);
    if (listOfTodo == null)
        todos = new ArrayList<Todo>();
    else
        todos = gson.fromJson(listOfTodo, new TypeToken<ArrayList<Todo>>() 
        .getType());

    //save at 0th position, recent should always come first
    todos.add(0, todo);
    sharedPreference.edit().putString(TODOS_LIST, gson.toJson(todos)).apply();


public ArrayList<Todo> getLocalTodos() 
    ArrayList<Todo> todos;
    String listOfTodos = sharedPreference.getString(TODOS_LIST, null);
    if (listOfTodos == null)
        todos = new ArrayList<Todo>();
    else
        todos = gson.fromJson(listOfTodos, new TypeToken<ArrayList<Todo>>() 
        .getType());
    return todos;


public void saveOnBackend() 
    // Connect to Backend solution

    // Get all local todos from preference
    // Save all at once in batches

    //OR

    // Get all local todos from preference
    // Save one by one

【讨论】:

感谢您的回复。但我想知道 AWS AppSync 的本地缓存是否可以在不需要任何其他本地存储的情况下工作(即使用户尚未登录)。 示例 AWS Appsync 应用程序无需任何登录即可工作,并以规范化形式将数据存储在本地 sqlite 中。请阅读此处的 AWS 论坛帖子forums.aws.amazon.com/thread.jspa?threadID=286304&tstart=0【参考方案2】:

使用Realm Database管理所有离线和在线数据并在应用程序卸载时保存

【讨论】:

【参考方案3】:

你可以阅读 https://docs.aws.amazon.com/appsync/latest/devguide/building-a-client-app-reactnative.html

AWS AppSync 支持离线模式 你可以为你的应用使用数据库

【讨论】:

以上是关于是否可以使用 AWS AppSync 构建离线优先的移动应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以预填充 AWS AppSync iOS 客户端?

如何处理与 AWS AppSync 离线同步的数据?

aws appsync 离线:收到错误未提供变量 ID

即使禁用离线,AWS AppSync 查询也会返回缓存响应

当设备连接到网络时,AWS AppSync 离线突变会多次更新到服务器

Aurora PostgreSQL 可以与 AWS AppSync 一起使用吗?