AWS AppSync在同一视图控制器中的多个订阅无法正常工作 – iOS Swift

仅供参考我最初在AWS AppSync论坛中发布了这个问题(以防AWS将来回答)。

我一直试图制作一个简单的post应用程序,如文档中的那个,但我没有找到在一个视图控制器中处理多个订阅的文档或指南。

三个突变:onCreatePost,onUpdatePost,onDeletePost(当然还有三个订阅这些突变)

在Xcode中,我在viewDidLoad()期间调用了三个函数:subscribeToNewPosts(),subscribeToUpdatedPosts(),subscribeToDeletedPosts()

每个订阅function都可以工作并创建具有正确function的订阅,并相应地更新表视图( 如果单独使用) 。 但是,如果一个接一个地调用,则只有最后一个订阅实际上会接收数据并更新表视图。 在订阅所有三个突变后,我在AppSyncMQTClient.swift中查看了topicSubscribersDictionary的断点

func startNewSubscription(subscriptionInfo: AWSSubscriptionInfo) { var topicQueue = [String]() let mqttClient = MQTTClient() mqttClient.clientDelegate = self for topic in subscriptionInfo.topics { if topicSubscribersDictionary[topic] != nil { // if the client wants subscriptions and is allowed we add it to list of subscribe topicQueue.append(topic) } } mqttClients.append(mqttClient) mqttClientsWithTopics[mqttClient] = topicQueue mqttClient.connect(withClientId: subscriptionInfo.clientId, toHost: subscriptionInfo.url, statusCallback: nil) } 

并且所有三个订阅实际上都在字典中……

我是否需要多个appSyncClient实例,每个订阅一个? 这是架构设计的问题吗?

schema.graphql

schema.json

mutations.graphql

queries.graphql

subscriptions.graphql

示例用例:简单的聊天应用。 新会话开始= OnCreatePostSubscription; 该会话中的新传入消息= OnUpdatePostSubscription

您是否在AppSync使用API Key进行授权? 如果您使用的是API Key ,则此时SDK仅支持一个订阅。 您可以切换到IAM (Cognito Identity)或基于Cognito UserPools的身份validation,看看多个订阅是否适合您?

我通过在startSubscriptions startNewSubscription调用startSubscriptions替换为startSubscriptionsstartNewSubscription使用API Key进行多次订阅

 if let subscriptionInfo = subscriptionResult.subscrptionInfo { self.subscriptionTopic = subscriptionResult.newTopics self.client?.addWatcher(watcher: self, topics: subscriptionResult.newTopics!, identifier: self.uniqueIdentifier) //self.client?.startSubscriptions(subscriptionInfo: subscriptionInfo) subscriptionInfo.forEach { self.client?.startNewSubscription(subscriptionInfo: $0) } } 

除了要求分叉iOS SKD之外,还没有找到任何这种方法的副作用