iOS中Apollo+GraphQL修改Schema后客户端无法同步的问题
这种字段同步卡壳的情况我之前也遇到过,别着急,咱们一步步来排查:
先确认后端模型真的更新成功
别只看本地的types.graphql,直接登录GraphCool控制台,找到你的服务,检查User类型里是不是确实存在telephone字段。有时候graphcool deploy会因为网络波动、字段定义语法错误(比如没指定类型,应该写telephone: String!或telephone: String)悄悄失败,控制台是最靠谱的验证入口。如果控制台里没有这个字段,重新运行graphcool deploy,仔细看终端输出日志找失败原因。强制拉取最新Schema并重新生成API.swift
Apollo iOS的代码生成依赖本地的schema.json,如果这个文件还是旧的,就算改了types.graphql也没用。手动执行以下两个命令:- 拉取最新后端Schema:
把地址换成你自己的GraphCool服务地址(控制台可查)。apollo-codegen download-schema https://your-graphcool-service-endpoint/graphql --output schema.json - 重新生成API.swift:
apollo-codegen generate *.graphql --schema schema.json --output API.swift
执行完后,检查API.swift里的User类型是否已经包含
telephone字段。- 拉取最新后端Schema:
检查查询文件的字段拼写和语法
打开你的User.graphql,确认telephone的拼写和后端完全一致(大小写、字母都不能错),且字段在正确的查询层级里。比如正确的查询格式应该是:query FetchUser($userId: ID!) { user(id: $userId) { id name telephone # 字段名必须和后端模型完全匹配 } }别犯类似把
telephone写成telphone的低级错误,这种问题编译器只会提示找不到字段,很难一眼察觉。清理Xcode缓存,彻底重建项目
Xcode的缓存有时候会顽固保留旧的类型信息,导致新字段不生效。试试这几步:- 按
Cmd+Shift+K清理当前项目 - 关闭Xcode,找到DerivedData文件夹(路径为
~/Library/Developer/Xcode/DerivedData),删除和你项目相关的文件夹 - 重新打开Xcode,先执行前面的代码生成命令,再点击编译按钮
- 按
检查Apollo客户端的Build Phase配置
如果你之前设置了自动生成API.swift的Build Phase脚本,确认脚本里的路径和命令都是正确的。比如脚本是否指向了正确的schema.json路径,生成的API.swift输出路径有没有变动。路径错误会导致脚本执行失败,API.swift也就不会更新。
内容的提问来源于stack exchange,提问作者Chen Li Yong

