Я нахожусь на xcode 11.4 и swift4, и в настоящее время я работаю с AWS GraphQL и изучаю правильный рабочий процесс. Мой amplify.xyz
конфиг установлен как
push=true
modelgen=true
profile=default
envName=amplify
, чтобы модели генерировались по мере их создания / редактирования. В schema.graphql
я определяю пользователя:
type User @model {
id: ID!
firstName : String!
lastName : String!
handle : String!
email : String!
}
И создаю / запускаю приложение, и могу создать / прочитать экземпляр user
, как и ожидалось. Затем предположим, что я добавляю простое новое поле User @model
, чтобы у меня было:
type User @model {
id: ID!
firstName : String!
lastName : String!
handle : String!
email : String!
blank : String!
}
А затем очистите папку сборки и пересоберите приложение. Затем я получаю необъяснимую ошибку
No such module 'Amplify' HomeController.swift
Даже если изменение класса Model
и Amplify
не связано. Если я удаляю blank
, очищаю и перестраиваю, все снова нормально. В чем причина такого поведения?
Для справки, вот мой подфайл:
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'alpha' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for alpha
pod 'amplify-tools'
pod 'Amplify'
pod 'AWSPluginsCore'
pod 'AmplifyPlugins/AWSAPIPlugin'
pod 'AWSMobileClient', '~> 2.13.0' # Required dependency
pod 'AWSUserPoolsSignIn', '~> 2.13.0'
pod 'AWSAppSync', '~> 3.1.0'
pod 'AWSMobileClient', '~> 2.13.0'
pod 'AWSAuthUI', '~> 2.13.0'
pod 'AWSUserPoolsSignIn', '~> 2.13.0'
end
______________________ ОБНОВЛЕНИЕ ___________________
Я и amplify push
, как предложил Жюльен С., и убедитесь, что все файлы в amplify/generated/models
перемещены в каталог верхнего уровня согласно (https://aws-amplify.github.io/docs/ios/start?ref=amplify-iOS-btn). Теперь эта проблема No such module 'Amplify' HomeController.swift
решена. Однако я больше не могу найти данные, которые были сохранены до обновления модели. Для справки: когда пользователь создает учетную запись, я получаю доступ к токену пользователя и сохраняю его вместе с электронной почтой пользователя. Затем в следующий раз, когда пользователь открывает приложение, я снова получаю токен и запрашиваю у пользователя db по токену. Соответствующий код:
class CognitoPoolProvider : AWSCognitoUserPoolsAuthProviderAsync {
func getLatestAuthToken(_ callback: @escaping (String?, Error?) -> Void) {
AWSMobileClient.default().getTokens { (token, error) in
if let error = error {
callback(nil,error)
}
callback(token?.accessToken?.tokenString, error)
}
}
}
В MainController.swift:
override func viewDidLoad() {
super.viewDidLoad()
// get user token
let pool = CognitoPoolProvider();
pool.getLatestAuthToken { (token, error) in
if let error = error {
print("error: \(error)")
} else {
self.getUserData(token: token!)
}
}
}
func getUserData(token:String){
print("token >>>> \(token)")
// this is successful. you got all the user stuff
// when you change the user model, you can no longer query the user
let _ = Amplify.API.query(from: User.self, byId: token) { (event) in
switch event {
case .completed(let result):
switch result {
case .success(let note):
guard let note = note else {
print("API Query completed but missing user")
return
}
print("API Query successful, got user: \(note)")
case .failure(let error):
print("Completed with error: \(error.errorDescription)")
}
case .failed(let error):
print("Failed with error \(error.errorDescription)")
default:
print("Unexpected event")
}
}
}