Fluux XMPP

Fluux XMPP 是一个使用 Swift 编写的聊天 SDK,适用于 iOS、MacOS 和 Linux。 它实现了 XMPP 协议,这是一个 IETF 标准。

Fluux XMPP 是一个全新的实现,其目标如下:

因此,在 iOS 上,我们的目标是 iOS 12+ 版本。 在 MacOS 上,我们专注于 Mojave 及更高版本 (10.14+)。 在 Linux 上,我们使用 BSD Socket 与 SwiftNIO,因此它应该可以广泛使用,只要您安装了 Swift 5.0+。

注意:此库正在积极开发中,尚未准备好用于生产环境。

构建 Fluux XMPP 库

我们设计构建系统时遵循以下原则:

因此,我们根据目标/构建系统以不同的方式构建平台

此决定使我们能够保持所有构建系统非常简单,同时具有良好的平台覆盖范围。

使用 Swift Package

安装 Homebrew 依赖项

您需要 libxml2 和 TLS 实现(即 libressl)。 您可以使用 HomeBrew 安装它们

brew install libxml2
brew install libressl

将 Fluux XMPP 作为依赖项添加到您的项目中

借助提供的 Package.swift 文件,您可以使用 Swift Package Manager 构建 lib。

您还需要明确地将构建目标设置为 MacOS 10.12,因为目前 Swift PM 使用 MacOS 10.10 作为部署目标的硬编码值(更多信息请参见 这里)。

要将 Fluux XMPP 集成到您的 Swift PM 项目中,您可以将其作为项目的依赖项添加到您的 Package.swift 文件中。 例如

// swift-tools-version:5.0

import PackageDescription

let package = Package(
    name: "XMPPDemo",
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        .package(url: "https://github.com/FluuxIO/XMPP.git", from: "0.0.2"),
    ],
    targets: [
        .target(
            name: "XMPPDemo",
            dependencies: ["XMPP"]),
        .testTarget(
            name: "XMPPDemoTests",
            dependencies: ["XMPPDemo"]),
    ]
)

您可以修改您的命令行可执行文件 main.swift 以启动 XMPP 客户端。 例如

import Foundation
import XMPP


guard let jid = JID("mremond@localhost/XMPPDemo") else { print("Invalid JID"); exit(1) }
var xmppConfig = Config(jid: jid, password: "mypass", useTLS: true)
xmppConfig.allowInsecure = true
xmppConfig.host = "MacBook-Pro-de-Mickael.local"
xmppConfig.streamObserver = DefaultStreamObserver()

let client = XMPP(config: xmppConfig)

let semaphore = DispatchSemaphore(value: 0)
client.connect {
  print("Disconnected !")
  semaphore.signal() 
}

_ = semaphore.wait(timeout: DispatchTime.distantFuture)

要构建项目,您只需使用标准构建命令

swift build

然后您可以运行您的控制台客户端

.build/debug/XMPPDemo

可以使用以下命令运行测试

swift test

在 Linux 上使用 Docker

您可以使用 Docker 官方镜像在 Linux 上处理 Swift 项目。 您也可以在 MacOS 上使用 Docker 来构建 Linux 版本。

您可以使用以下命令检索 Swift Docker 镜像

docker pull swift

然后,您可以构建并在容器内打开 Linux shell

docker run  -itv $(pwd):/code --name swiftcode -w /code swift /bin/bash

然后,您需要在容器中使用以下命令安装 libxml2-devlibssl-dev 开发包

apt-get update
apt-get install libxml2-dev libssl-dev

从 Docker shell,您可以使用以下命令构建代码

swift build

要在 Linux 上运行测试,您需要明确启用测试发现(请参阅 Swift Test Discovery

swift test --enable-test-discovery

TLS 支持

目前,该库仅支持标准 TLS 连接,不支持 STARTTLS。 Apple Networking 库不支持(尚未?)在建立连接后切换加密,因为他们担心 STARTTLS 实现可能存在的安全问题。

也就是说,XMPP 支持端口 5223 上的 TLS。 它被称为“legacy”SSL,因为使用端口 5223 很久以前就被 XMPP Standards Foundation 弃用了。 也就是说,现代 XMPP 服务器(如 ejabberd)支持端口 5223 上的最先进的 TLS。 目前,要使用 TLS,完全可以使用端口 5223 上的 TLS。