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

Posted

技术标签:

【中文标题】同一视图控制器中的 AWS AppSync 多个订阅不起作用 - iOS Swift【英文标题】:AWS AppSync multiple subscriptions in same view controller not working - iOS Swift 【发布时间】:2018-08-19 02:49:50 【问题描述】:

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

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

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

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

每个订阅函数都工作并创建具有正确功能的订阅并相应地更新表格视图如果单独使用。但是,如果一个接一个地调用,只有最后一个订阅才会真正接收数据并更新表视图。在订阅了所有三个突变后,我在 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.graphql

schema.json

mutations.graphql

queries.graphql

subscriptions.graphql

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

就是这样。我切换到 Cognito Identity auth 并且它可以工作(我还没有尝试使用用户池,这是我想要使用的)。在不上网搜索已回答问题的情况下,很难弄清楚如何获得正确工作的权限。我知道你们总是对自己的 ios 文档感到不满,但我会说你们很快就回答了 AWS 论坛/*** 的问题。对于阅读本文的任何人,请确保您的 IAM 角色包含对您的 AppSync API 资源的允许。 顺便说一句,让 UserPools 工作!唯一的问题仍然是S3。在撰写本文时,codegen 的 --add-s3-wrapper 标志已损坏。未创建 S3Object 类。这么近! 您能详细说明一下吗?代码生成器应该使用您在上面指定的标志。您是否按照文档中的建议定义了架构?类型名称必须完全匹配才能使生成器工作。 按照您在 AWS 论坛回复中的说明以及 githhub.io 页面上的说明将 S3Object 更新为 .graphql 文件中的片段后,一切正常。感谢您的帮助!【参考方案2】:

通过将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: $0) 

除了需要分叉 iOS SKD 之外,还没有发现这种方法有任何副作用

【讨论】:

奇怪我还能用api key实现多个subs。 以前版本有限制,但是由于iOS SDK 2.6.22,你可以在通过API Key进行身份验证的同时有多个订阅。 嘿! @MarioBajr,你确定吗?顺便感谢您提供的信息。 嗨@dreamBegin,您可以在项目更改日志中提及它。 github.com/awslabs/aws-mobile-appsync-sdk-ios/blob/master/… 非常感谢!我只是在写评论后检查了一下。干杯!!快乐编码:)

以上是关于同一视图控制器中的 AWS AppSync 多个订阅不起作用 - iOS Swift的主要内容,如果未能解决你的问题,请参考以下文章

订阅 AWS AppSync 中的群组/私人聊天列表

如何订阅 AWS AppSync 客户端中的多个事件?

使用 AWS Appsync 和 GraphQL 查询 Dynamo DB 中的多个表

AWS AppSync - 从 AppSync 控制台运行时的 GraphQL 查询超时

如何在 AWS AppSync 控制台中测试订阅?

如何在 AWS AppSync GraphQL 架构上处理多个 @auth 指令?