XMPP 0.0.3

XMPP 0.0.3

ProcessOne 维护。



XMPP 0.0.3

  • Mickaël Rémond 和 ProcessOne 编写

Fluux XMPP

Fluux XMPP 是一个针对 iOS,MacOS 和 Linux 的聊天 SDK,它实现了 IETF 标准的 XMPP 协议。

Fluux XMPP 是一个从头开始实现的项目,以下目标是主要的

  • 专注于简洁性,通过隐藏 XMPP 技术细节并仅公开聊天相关的功能。
  • 专注于现代 Swift,最近的 iOS 版本和现代 XMPP。库故意忽略了过时或已弃用的功能。
  • 关注可维护性。XMPP 是一个复杂的协议,可维护性应该是设计决策的主要标准,以便能够长期可持续。
  • 关注效率和可扩展性,仅利用可扩展的部分 XMPP 协议。许多 XEPs 对大规模生产来说过于消耗资源。

因此,在 iOS 上,我们针对 iOS 版本 12+。在 MacOS 上,我们关注 Mojave (10.14),但应该可以从 10.12 版本开始使用 SwiftNIO 运行。在 Linux 上,我们使用 BSD Socket 与 SwiftNIO,因此它应该在广泛的环境中运行,只要您已安装 Swift 4.2。

注意:此库处于非常活跃的开发中,尚不适用于生产环境。

构建 Fluux XMPP 库

我们以以下原则设计构建系统

  • 目标是多平台(iOS、MacOS、Linux),同时利用最新的 iOS 和 MacOS 特性。
  • 我们希望灵活且易于集成到所有主要的依赖管理工具中(SwiftPM、CocoaPods、Carthage)。

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

  • 在 Carthage 和 Cocoapods 中,我们使用 Apple Network.framework,因此目标为 iOS 12+ 和 MacOS 10.14+。这意味着对于标准的 iOS 或 MacOS 构建,没有其他依赖项。
  • 在 SwiftPM 中,我们使用 Swift-NIO 以与 Linux 和较旧的 MacOS 版本(10.12+)兼容。

这一决策使我们能够保持所有构建系统都非常简单,同时具有良好的平台覆盖。

在Carthage中使用Fluux XMPP

  1. 按常规在XCode中创建您的项目。
  2. 将项目保存为工作空间,以便您可以作为子模块构建您的依赖项。关闭项目。
  3. 如果您尚未安装此工具,请安装Carthage
  4. 创建一个Cartfile(或更新现有的一个)以将Fluux XMPP作为依赖项包含在内
    github "FluuxIO/XMPP.git" ~> 0.0
    
  5. 下载并构建Fluux XMPP依赖项
    carthage update --platform iOS --use-submodules --no-use-binaries
    我们使用--use-submodules,因此我们的依赖项作为子模块添加。这允许用户在没有Carthage的情况下构建生成的应用程序。我们使用--no-use-binaries,使得依赖项在我们的系统上本地构建。
  6. 打开您的应用程序工作空间,并将您的依赖项项目添加到您的工空中。您可以通过将捆绑包Carthage/Checkouts/XMPP/XMPP.xcodeproj拖放到工作空间中来实现。
  7. 在您的目标的一般标签页中,将Fluux XMPP添加为嵌入式二进制文件。点击+并选择iOS的XMPP.framework。
  8. 您现在应该能够从您的应用程序中使用该框架。以下是一段最小化代码示例,您可以将它添加到应用程序中以添加一个XMPP客户端:[Fluux XMPP v0.0.1的Fluux XMPP客户端示例](https://gist.github.com/mremond/319dd29f2c308cf807f199b812260f98)

在CocoaPods中使用Fluux XMPP

Fluux XMPP库在CocoaPods上发布。

您可以使用以下方式使用它

  1. 关闭您的项目

  2. 创建(或更新)您的Podfile以包含pod 'XMPP'。例如

    platform :ios, '12.0'
    
    target 'XMPPPodTest' do
      pod 'XMPP'
    end
    
    post_install do |installer| 
      installer.pods_project.build_configurations.each do |config|
        if config.name == 'Release'
          config.build_settings['SWIFT_COMPILATION_MODE'] = 'wholemodule'
        end    
      end
    end
  3. 安装依赖项

    pod install
  4. 打开工作空间。现在您可以使用Fluux XMPP。以下是将Fluux XMPP作为XMPP客户端添加到应用程序中的最小化代码示例:[Fluux XMPP v0.0.1的Fluux XMPP客户端示例](https://gist.github.com/mremond/319dd29f2c308cf807f199b812260f98)

使用Swift Package

安装homebrew依赖

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

brew install libxml2
brew install libressl

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

您可以使用提供的Package.swift文件,通过Swift包管理器构建lib。

您还需要显式地将构建目标设置为MacOS 10.12,因为目前Swift PM使用MacOS 10.10作为硬编码的部署目标(更多内容请参见此处)。

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

// swift-tools-version:4.2

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"]),
    ]
)

您可以将命令行可执行文件修改为启动一个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)

以下是一个典型的构建命令,您可以将它传递给项目,以强制最小构建目标为MacOS Mojave

swift build -Xswiftc "-target" -Xswiftc "x86_64-apple-macosx10.14"

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

.build/debug/XMPPDemo

计划在不支持该新框架的平台(即Linux和较老版本的MacOS)上使用Swift-NIO而不是Network框架。Swift-NIO不在iOS上可用。

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

swift test -Xswiftc "-target" -Xswiftc "x86_64-apple-macosx10.14"

在Docker中在Linux上工作

您可以使用Docker官方镜像在Linux上对Swift项目进行工作

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

然后您需要在容器中安装libxml2-dev软件包

apt-get update
apt-get install libxml2-dev

TLS支持

目前该库只支持标准TLS连接,不支持STARTTLS。由于担心STARTTLS实现可能存在的安全问题,Apple网络库不支持(尚未支持?)在连接建立后将加密进行切换。

话说回来,XMPP在端口5223上支持TLS。这被称为“遗留”SSL,因为XMPP标准基金会很久以前已经废弃了端口5223的使用。但是,现代的XMPP服务器例如ejabberd在端口5223上支持最新的TLS技术。目前使用TLS的话,在端口5223上使用TLS是完全没有问题的。