同一视图控制器中的 AWS AppSync 多个订阅不起作用 - iOS Swift

AWS AppSync multiple subscriptions in same view controller not working - iOS Swift

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

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

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

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

每个订阅功能都可以工作并创建具有正确功能的订阅并相应地更新 table 视图 如果单独使用。但是,如果一个接一个地调用,只有最后一个订阅会实际接收数据并更新 table 视图。在订阅了所有三个突变

之后,我在 AppSyncMQTTClient.swift 中放置了一个断点来检查 topicSubscribersDictionary
func startNewSubscription(subscriptionInfo: AWSSubscriptionInfo) {
        var topicQueue = [String]()
        let mqttClient = MQTTClient<AnyObject, AnyObject>()
        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设计的问题吗?

schema.graphql

schema.json

mutations.graphql

queries.graphql

subscriptions.graphql

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

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

通过在 AWSAppSyncSubscriptionWatcher

中将调用 startSubscriptions 替换为 startNewSubscription,我设法让多个订阅与 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: [=10=]) }
}

除了需要分叉 iOS SKD

之外,还没有发现这种方法的任何副作用