apollo-ios的入门指南
首先
apollo-ios是ApolloClient的iOS版本。基本上遵循这个指南应该就可以了,但是有一些容易出错的地方,我会辅助解释并帮助其他有类似问题的人。详细信息请参考:https://www.apollographql.com/docs/ios/installation.html
阅读这篇文章后能够做的事情
-
- apollo-iosを開発しているiosアプリに導入できる
- apollo-iosの簡単な使い方が理解できる
环境
Xcode 版本 10.1 (10B61)
阿波罗 (0.9.4)
安装 Apollo 框架
这只是一个简单的安装过程。
我使用CocoaPods。
pod "Apollo"
pod install
可以只需要一个选择,用中文将以下内容进行释义:「でOK」
添加一个代码生成构建步骤

-
- 选择目标和BuildPhase
-
- 按下”+”选择New Run Script Phase
-
- 将脚本名称更改为Generate Apollo GraphQL API
- 粘贴以下代码(适用于CocoaPods)
APOLLO_FRAMEWORK_PATH="$(eval find $FRAMEWORK_SEARCH_PATHS -name "Apollo.framework" -maxdepth 1)"
if [ -z "$APOLLO_FRAMEWORK_PATH" ]; then
echo "error: Couldn't find Apollo.framework in FRAMEWORK_SEARCH_PATHS; make sure to add the framework to your project."
exit 1
fi
cd "${SRCROOT}/${TARGET_NAME}"
$APOLLO_FRAMEWORK_PATH/check-and-run-apollo-cli.sh codegen:generate --queries="$(find . -name '*.graphql')" --schema=schema.json API.swift
- 然后只有在仔细阅读才会注意到
“生成 Apollo GraphQL API”,将其拖动到“编译源代码”之上。
因为写着这个,所以将“Generate Apollo GraphQL API”放在Compile Sources的上方。

通过这个脚本在构建时执行,在自动查找.graphql文件并创建所需的.swift文件。
将一个架构文件添加到目标目录中。
接下来准备schema.json文件。
如果环境支持apollo cli,则最好使用这种方法。
对于我个人来说,我使用graphql-ruby,
可以在rails控制台上执行以下一行命令来创建schema.json:
https://github.com/rmosolgo/graphql-ruby/pull/1354/files#diff-ee904bfc600cba8c1b186cda3fe7fd11
File.open("schema.json", "w") do |f| f.write(ApoleSchema.execute(GraphQL::Introspection::INTROSPECTION_QUERY).to_json) end
制定你的目标
请将创建的`schema.json`文件放置在目标目录中,并在此时进行一次构建。
应该会生成一个名为`API.swift`的文件。
(因为此时没有`.graphql`文件,所以空状态是可以的)
→需要创建一个虚拟的`.graphql`文件并进行补充。
query GetUser {
user {
id,
email
}
}
请注意:如果您的文件树中没有预先存在的.graphql文件,请创建一个非常简单的查询并将其添加到文件树中的一个.graphql文件中,这样当您运行代码生成构建步骤时,它实际上会找到一些东西。如果没有,您将会收到“找不到任何操作或片段来生成代码”的错误。
在这种情况下,也有一些容易出错的地方,生成的文件在Xcode上不会显示出来。
如果您在终端或其他地方进行确认,就可以看到它们已经生成了。
将生成的API文件添加到您的目标中
可使用Finder等工具选择生成的API.swift文件,并添加到目标位置。
(选项)安装Xcode的附加组件来获得语法高亮功能。
若您执行此操作,将能为.graphql文件添加语法高亮。由于这只是一个选项且只需直接运行,因此不再进行详细解释。
使用你的查询或变更来创建.graphql文件。
由于准备工作已经完成,我们将创建一个简单的.graphql文件。(请根据您的schema进行修改)
query GetUser {
user {
id,
email
}
}
构建时会自动生成代码到API.swift文件中!
public final class GetUserQuery: GraphQLQuery {
public let operationDefinition =
"query GetUser {\n user {\n __typename\n id\n email\n }\n}"
public init() {
}
...
创建一个客户端
我们来试试刚才创建的GetUserQuery。
首先,在AppDelegate.swift文件中创建ApolloClient客户端。
let apollo = ApolloClient(url: URL(string: "http://localhost:8080/graphql")!)
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
...
这样就成为全局变量,所以很容易实现,但是使用全局变量这么简单真的可以吗?有点怀疑。
最简单的方法是在AppDelegate.swift中定义一个全局变量。
获取查询
因为现在客户端可以使用了,所以我将尝试执行刚刚创建的查询。
apollo.fetch(query: GetUserQuery()) { (result) in
switch result {
case .success(let graphQLResult):
print("Success! Result: \(graphQLResult)")
case .failure(let error):
print("error!: \(error)")
}
}
只要在控制台上能夠輸出電子郵件,就可以了!
祝你的Hack愉快进展顺利。