xcode
Swift接入Apollo GraphQL并使用CLI生成代码
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