xmppStreamDidConnect 永远不会在 Swift 中被调用

Posted

技术标签:

【中文标题】xmppStreamDidConnect 永远不会在 Swift 中被调用【英文标题】:xmppStreamDidConnect never gets called in Swift 【发布时间】:2019-04-18 11:39:42 【问题描述】:

我正在尝试使用 XMPPFramework 在 Swift 应用程序中连接到我的聊天服务器,但 didConnect 委托方法从未被调用。 我在 Objective C 中创建了一个基本应用程序,我可以毫无问题地在我的聊天服务器中连接和验证。

在 Swift 项目中我尝试连接代码:

class AppDelegate: UIResponder, UIApplicationDelegate 
    var stream:XMPPStream = XMPPStream()
    var reconnect:XMPPReconnect = XMPPReconnect()
    var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
    stream.addDelegate(self, delegateQueue: DispatchQueue.main)
    stream.myJID = XMPPJID(string: "user@chatserver.net")
    reconnect.activate(stream)
    do 
        try stream.connect(withTimeout: XMPPStreamTimeoutNone)
    
    catch let err
        print("error occured in connecting\(String(describing: err.localizedDescription))")
    
    return true

我已经调试了 XMPPFramework 并在方法 - (void)handleStreamFeatures 中执行了对委托的调用:

[multicastDelegate xmppStreamDidConnect:self];

我查看了 multicastDelegateObject 并且有一个节点引用了我的委托和 OS_dispatch_queue_main,但在执行后我的 xmppStreamDidConnect 方法没有执行。

【问题讨论】:

【参考方案1】:

正如Github Issue, 中所述,问题在于方法声明。 我的xmppStreamDidConnect 需要一个下划线,根本问题是如果你不导入 swift 扩展,编译器会将该声明标记为不正确,尽管它可以工作。 所以要解决我的问题,我需要导入 pod 'XMPPFramework/Swift' 并将方法声明更改为

func xmppStreamDidConnect(_ sender: XMPPStream) 

【讨论】:

以上是关于xmppStreamDidConnect 永远不会在 Swift 中被调用的主要内容,如果未能解决你的问题,请参考以下文章

RequestPermissionsAsync 永远不会返回

猫鼬承诺永远不会到达 .then()

为啥 IsDialogMessage() 可能永远不会返回?

CATransaction 完成块永远不会触发

AVPlayer seekToTime 永远不会完成

如果位置服务关闭,CLLocationManager 永远不会更新