May 01, 2024

Swift接入Apollo GraphQL并使用CLI生成代码

✏️ 笔者是GraphQL深度爱好者,在学习Swift开发过程中也希望能够将其引入,过程中也遇到一些包管理问题,参阅了官网文档后成功接入,下面是整个过程。


✏️ 笔者是GraphQL深度爱好者,在学习Swift开发过程中也希望能够将其引入,过程中也遇到一些包管理问题,参阅了官网文档后成功接入,下面是整个过程。

设备信息: Xcode版本:Version 14.3.1 (14E300c) Mac OS :13.4

开始

安装Apollo IOS Client

这里包管理使用了**SPM(Swift Package Manager)**,之前使用Cocoapods,没能正常跑起来,而且感觉这种方式对项目的侵入性比较强,开发体验不好。

在Xcode中,File→Add Packages,然后填入https://github.com/apollographql/apollo-ios

按需选择你需要的库,比如你想用到WebSocket就可以一起加入

安装CLI工具

我们需要用apollo-ios-cli来下载GraphQL的Schema,并且用他来来生成业务所需要的查询代码。

在项目根目录上右键,选择Install CLI。

此时,项目中已经接入了Apollo Client,不过为了更方便业务使用,我们还需要讲我们自己的查询语句生成更易使用的Swift代码。

代码生成

下载GraphQL Schem

下载我们GraphQL Server的GraphQL,可以使用CLI去生成这份文件,这里推荐直接复制下面的文件,然后自己在Xcode里面创建apollo-codegen-config.json并粘贴。

需要注意几个点:

  • operationSearchPaths 这里说的是你需要需要查询的GraphQL DSL
  • schemaSearchPaths 你的GraphQL所有的DSL描述
  • endpointURL GraphQL Server地址
  • schemaTypes.path CLI生成Swift的代码目录
  • outputPath 下载后的文件放在哪里,这里推荐放在项目目录下的./graphql
{
  "schemaNamespace": "RocketReserverAPI",
  "input": {
    "operationSearchPaths": ["**/*.graphql"],
    "schemaSearchPaths": ["**/*.graphqls"]
  },
  "output": {
    "testMocks": {
      "none": {}
    },
    "schemaTypes": {
      "path": "./RocketReserverAPI",
      "moduleType": {
        "swiftPackageManager": {}
      }
    },
    "operations": {
      "inSchemaModule": {}
    }
  },
  "schemaDownloadConfiguration": {
    "downloadMethod": {
      "introspection": {
        "endpointURL": "https://api.xxxx.com/graphql",
        "httpMethod": {
          "POST": {}
        },
        "includeDeprecatedInputValues": false,
        "outputFormat": "SDL"
      }
    },
    "downloadTimeout": 60,
    "headers": [],
    "outputPath": "./graphql/schema.graphqls"
  }
}

文件配置好之后,在终端进入项目根目录,执行下面代码

./apollo-ios-cli fetch-schema

执行后,你的项目目录会多出一个目录,里面包含你GraphQL Server提供的DSL

编写业务gql查询语句

这这里我随便写了一个查询语句,这里的目的主要是让CLI根据查询语句生成对应的Swift的查询对象,下面这段语句最后会生成public class GetPromptQuery: GraphQLQuery 等等,可以继续往下看

生成对应定义

编写完就运行下面代码

./apollo-ios-cli generate

将生成的代码加入Swift 项目

同样在刚才 File→Add Packages 选择本地包

选择刚才生成的

链接二进制包

我在初次调试的时候一直提示我Cannot find 'GetPromptQuery' in scope 是因为没有将Apollo生成的代码加入项目。

此时,项目就已经接入了CLI生成业务代码,可以直接在Swift文件中使用。

下一篇文章我们讲如何将请求与我们的UI结合起来。

参考

Introduction