Я пытаюсь подключиться к своему сервису AWS AppSync из своего мобильного приложения Swift с помощью AWS Swift SDK, но продолжаю получать следующую ошибку:
Error occurred: (401 unauthorized) Did not receive a successful HTTP code.
Я использую пулы пользователей и все настроил, следуя инструкциям по быстрой настройке. У меня вопрос: как включить в свой запрос конфигурационный файл AppSync.json, созданный в консоли? Это не упоминается в руководстве и может быть причиной того, что я не могу подключиться.
Файл json выглядит так:
{
"graphqlEndpoint": "my_endpoint_url",
"region": "us-east-1",
"authenticationType": "AMAZON_COGNITO_USER_POOLS",
"apiKey": null
}
На данный момент я использую следующую конфигурацию:
// Set up Amazon Cognito credentials
let credentialsProvider = AWSCognitoCredentialsProvider(regionType: CognitoIdentityRegion,
identityPoolId: CognitoIdentityPoolId, identityProviderManager: pool)
// You can choose your database location, accessible by SDK
let databaseURL = URL(fileURLWithPath:NSTemporaryDirectory()).appendingPathComponent(database_name)
do {
// Initialize the AWS AppSync configuration
let appSyncConfig = try AWSAppSyncClientConfiguration(url: AppSyncEndpointURL,
serviceRegion: AppSyncRegion,
credentialsProvider: credentialsProvider,
databaseURL:databaseURL)
appSyncClient = try AWSAppSyncClient(appSyncConfig: appSyncConfig)
// Set id as the cache key for objects
appSyncClient?.apolloClient?.cacheKeyForObject = { $0["id"] }
} catch {
print("Error initializing appsync client. \(error)")
}
РЕДАКТИРОВАТЬ # 1
Оказывается, в примере используется метод ключа API, а не пулы пользователей. Итак, теперь я изменил конфигурацию на:
let appSyncConfig = try AWSAppSyncClientConfiguration(url: AppSyncEndpointURL, serviceRegion: AppSyncRegion, userPoolsAuthProvider: CognitoUserPoolsAuthProvider(pool: pool))
Проблема в том, что теперь сообщение:
Use of unresolved identifier 'CognitoUserPoolsAuthProvider'
если я попробую:
let appSyncConfig = try AWSAppSyncClientConfiguration(url: AppSyncEndpointURL, serviceRegion: AppSyncRegion, userPoolsAuthProvider: AWSCognitoUserPoolsAuthProvider(pool: pool))
ошибка:
'AWSCognitoUserPoolsAuthProvider' cannot be constructed because it has no accessible initializers
Не уверен, как удовлетворить аргумент userPoolsAuthProvider: в config.





Чтобы решить вашу конкретную проблему, userPoolsAuthProvider должен принять класс, расширяющий протокол AWSCognitoUserPoolsAuthProvider. Таким образом, ваш экземпляр будет выглядеть примерно так:
let appSyncConfig = try AWSAppSyncClientConfiguration(url: AppSyncEndpointURL,
serviceRegion: AppSyncRegion,
userPoolsAuthProvider: self,
databaseURL:databaseURL)
А затем в классе, в котором вы создаете AppSyncClient, вы бы расширили его следующим образом:
extension YourClass: AWSCognitoUserPoolsAuthProvider {
func getLatestAuthToken() -> String {
var token: String = ""
// pool is an instance of AWSCognitoIdentityUserPool
self.pool?.currentUser()?.getSession().continueOnSuccessWith(block: { (task) -> Any? in
token = task.result!.idToken!.tokenString
return nil
}).waitUnitFinished()
}
return token
}
Также я считать конфигурация AppSync по умолчанию ищет файл awsconfiguration.json в вашем проекте. Вы опубликовали это некоторое время назад, поэтому, возможно, что-то изменилось с сервисами AWS и AppSync.
Надеюсь это поможет
Все верные утверждения. Но, надеюсь, это помогло вам продвинуться дальше
.waitUntilFinished блокирует основной поток. время от времени это вызывает значительное отставание приложения и предупреждения отладчика. также вам необходимо развернуть дополнительный токен в опубликованном вами коде, и если он равен нулю, это приведет к сбою.