swift - XMPPFramework (Swift) 的问题
问题描述
当我运行此代码时,没有迹象表明 XMPPController 已连接到 Ejabberd 服务器。XMPPStreamDelegate 方法也没有被调用。就好像代码甚至不存在一样。应该有一些迹象表明我不应该在那里连接?其他人有这个问题吗?这是我的代码。谢谢。
XMPPController 类:
import Foundation
import XMPPFramework
enum XMPPControllerError: Error {
case wrongUserJID
}
class XMPPController: NSObject {
var xmppStream: XMPPStream
let hostName: String
let userJID: XMPPJID
let hostPort: UInt16
let password: String
init(hostName: String, userJIDString: String, hostPort: UInt16, password: String) throws {
guard let userJID = XMPPJID(string: userJIDString) else {
throw XMPPControllerError.wrongUserJID
}
self.hostName = hostName
self.userJID = userJID
self.hostPort = hostPort
self.password = password
self.xmppStream = XMPPStream()
self.xmppStream.hostName = hostName
self.xmppStream.hostPort = hostPort
//self.xmppStream.startTLSPolicy = XMPPStreamStartTLSPolicy.allowed
self.xmppStream.enableBackgroundingOnSocket = true
self.xmppStream.myJID = userJID
super.init()
self.xmppStream.addDelegate(self, delegateQueue: DispatchQueue.main)
}
func connect() {
if !self.xmppStream.isDisconnected() {
return
}
do {
try self.xmppStream.connect(withTimeout: 5)
} catch {
print("ERROR CONNECTING")
}
}
}
extension XMPPController: XMPPStreamDelegate {
func xmppStreamDidConnect(_ sender: XMPPStream!) {
print("Stream: Connected")
try! sender.authenticate(withPassword: self.password)
}
func xmppStreamDidAuthenticate(_ sender: XMPPStream!) {
self.xmppStream.send(XMPPPresence())
print("Stream: Authenticated")
}
}
AppDelegate(用于测试 XMPPController)
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var xmppController: XMPPController!
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
try! self.xmppController = XMPPController(hostName: "192.168.0.33", userJIDString: "admin@192.168.0.33", hostPort: 5221, password: "password")
return true
}
func applicationWillResignActive(_ application: UIApplication) {
}
func applicationDidEnterBackground(_ application: UIApplication) {
}
func applicationWillEnterForeground(_ application: UIApplication) {
}
func applicationDidBecomeActive(_ application: UIApplication) {
}
func applicationWillTerminate(_ application: UIApplication) {
}
}
无论出于何种原因,这都行不通。
解决方案
您的 ejabberd 服务器是否正常工作。您可以通过运行 ./ejabberdctl status 检查 ejabberd 服务器的状态。另外,你能检查一下 ejabberd 日志吗?检查您的 ejabberd 是否配置正确和工作的一个好方法是使用 Adium 登录到您的 ejabberd 服务器。
在这部分代码中检查端口是否为5222而不是5221
try! self.xmppController = XMPPController(hostName: "192.168.0.33", userJIDString: "admin@192.168.0.33", hostPort: 5221, password: "password")
如果 5221 是正确的,你应该调用函数 connect()。
self.xmppController.connect()
连接
推荐阅读
- kotlin - 接口中不允许使用属性初始化器
- python - 如何在 pytest 中的每次测试后完全拆除 Flask 应用程序?
- python - 访问当前行的索引值以在 Python 数据框中进行计算
- solr - 有没有使用 Solr 预先构建的简单搜索引擎?
- python - 如何抓取包含纯文本和“双引号”中的文本的表格数据?
- javascript - GraphQL 查询从复杂查询返回未定义的变量
- linux - 使用个人访问令牌推送到 git
- selenium - 遍历 WebElement 列表时获取 StaleElementReferenceException
- sweetalert2 - 文件上传队列并在上传期间显示加载器/进度
- sql - SQL 返回列值更改的最后一条记录和更改量