求AWS AppSync Swift版S3图片上传可运行示例及问题解决
解决AWS AppSync iOS开发中的版本冲突与S3Object类缺失问题
我之前在做AWS AppSync iOS开发时,也碰到过一模一样的依赖版本冲突和S3Object类缺失的问题,折腾了好一阵子才搞定。下面给你一套亲测可行的解决方案和可运行示例,帮你快速跳出坑:
一、先搞定AWSCore版本冲突问题
问题根源在于AWSAppSync和AWSS3依赖了不同版本的AWSCore,我们需要在Podfile里强制统一所有AWS依赖的AWSCore版本,避免版本不一致导致的冲突。
可直接复用的Podfile配置
platform :ios, '13.0' use_frameworks! target 'YourAppName' do # 强制指定统一的AWSCore版本,这里选2.6.12(和AWSAppSync 2.6.7兼容) pod 'AWSCore', '2.6.12' # 指定AppSync版本,同时会自动使用上面的AWSCore版本 pod 'AWSAppSync', '2.6.7' # 让S3依赖和AWSCore同版本 pod 'AWSS3', '2.6.12' end
执行步骤
- 删除项目目录下的
Podfile.lock文件和Pods文件夹 - 终端执行
pod install --repo-update,确保拉取到正确版本的依赖包
二、解决S3Object类未生成的问题
api-appsync-codegen不会凭空生成S3Object类,通常是两个原因:你的GraphQL Schema里没定义这个类型,或者你的查询/突变里没用到这个类型。
1. 确保Schema包含S3Object类型
从AWS AppSync控制台导出最新的schema.json文件,里面必须包含S3Object的类型定义,比如:
type S3Object { bucket: String! key: String! region: String! }
如果你的API配置了S3存储集成,这个类型应该会自动出现在Schema里;如果没有,手动添加后重新导出。
2. 正确执行Codegen命令
确保你的查询文件(比如queries.graphql)里有涉及S3Object的查询/突变,比如:
query GetUserProfile { getUserProfile(id: "user123") { id name avatar { bucket key region } } }
然后执行以下命令生成代码(假设schema.json和queries.graphql都在项目根目录):
appsync-codegen generate ./queries.graphql --schema ./schema.json --output ./YourAppName/API/API.swift
这样生成的API.swift里就会包含S3Object类了。
三、可运行的完整示例流程
- 创建一个新的iOS Swift项目(最低iOS版本选13.0)
- 把上面的Podfile配置复制到项目根目录,替换
YourAppName为你的项目名 - 执行
pod install,打开生成的.xcworkspace文件 - 从AppSync控制台导出最新的
schema.json,放到项目根目录 - 创建
queries.graphql文件,添加包含S3Object的查询(参考上面的示例) - 执行codegen命令生成API.swift,把这个文件添加到Xcode项目中
- 配置AppSync客户端(在AppDelegate或SceneDelegate中):
import AWSAppSync var appSyncClient: AWSAppSyncClient? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { do { let appSyncConfig = try AWSAppSyncClientConfiguration( url: URL(string: "你的AppSync端点URL")!, region: .usEast1, // 替换成你的AWS区域 authType: .apiKey(apiKey: "你的AppSync API密钥") ) appSyncClient = try AWSAppSyncClient(appSyncConfig: appSyncConfig) } catch { print("初始化AppSync客户端失败:\(error)") } return true }
- 在ViewController里测试查询:
import UIKit import AWSAppSync class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() appSyncClient?.fetch(query: GetUserProfileQuery(id: "user123")) { result, error in if let error = error { print("查询失败:\(error.localizedDescription)") return } if let profile = result?.data?.getUserProfile, let avatar = profile.avatar { print("头像存储桶:\(avatar.bucket)") print("头像Key:\(avatar.key)") } } } }
内容的提问来源于stack exchange,提问作者Michael Economy
相关产品推荐
相关产品推荐

