MagistralSwift 0.7.15

MagistralSwift 0.7.15

Tests测试
Lang语言 SwiftSwift
许可证 MIT
Released最新版本2017年6月
SwiftSwift 版本3.0
SPM支持 SPM

MagistralSwift 维护。



 
依赖
Alamofire~> 4.4.0
SwiftMQTT>= 0
SwiftyJSON~> 3.1.4
 

  • roman.kurpatov

MagistralSwift

Magistral 是一个用 Swift 3 编写的消息库。

特性需求使用

特性

  • [x] 发送/接收数据消息
  • [x] 回放(历史数据)
  • [x] 资源发现
  • [x] 访问控制
  • [x] TLS 加密通信
  • [ ] 客户端侧 AES 加密

需求

  • iOS 9.0+
  • Xcode 8.0+
  • Swift 3.0+

安装

手动

如果你不希望使用上面提到的任何一个依赖管理器,你可以手动将 MagistralSwift 集成到你的项目中。


使用

先决条件

首先,为了通过 Magistral 网络流式传输数据,你需要创建一个应用。如果你还没有任何应用,你可以轻松地从 客户管理面板(通过起始页面或在 应用管理 部分)创建一个。

另外,你需要创建至少一个主题,你可以从 主题管理 面板中完成这一操作。

基于密钥的访问

Magistral网络接入基于密钥。建立连接需要三个密钥:

  • 发布密钥 - 用于发布消息的应用特定密钥。
  • 订阅密钥 - 用于读取消息的应用特定密钥。
  • 秘密密钥 - 用于识别用户及其权限的用户特定密钥。

您可以在应用程序管理部分找到这两个密钥。在列表中选择您的应用,然后点击应用程序面板标题中的剪贴板图标以复制这些密钥到剪贴板。

秘密密钥 - 您可以在用户管理部分找到用户权限中。只需点击权限列表中的右键即可将链接到用户权限的秘密密钥复制到剪贴板。

连接

要连接到Magistral网络,您需要创建Magistral实例并提供 pubsubsecret 密钥。

import MagistralSwift

let magistral = Magistral(
    pubKey: "pub-xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    subKey: "sub-xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    secretKey: "s-xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");

连接回调

建立连接到网络并能够使用Magistral功能通常需要几毫秒。

因此,为了在连接就绪时获得通知,您需要提供额外的回调参数。它包含连接状态和Magistral实例的引用

import MagistralSwift

let magistral = Magistral(pubKey: {pub_key}, subKey: {sub_key}, secretKey: {secret_key},
    connected: { connected, magistral in
      ...
    }
);

主题

要发现所有可用的主题和通道,您可以调用

try magistral.topics { meta, err in
    for mi in meta {
        let topic = mi.topic()
        let channels = mi.channels();
//      Do something with topic and channels
    }
}

如果您知道主题名称并想查看通道信息

try magistral.topic("topic", callback: { meta, err in
    for mi in meta {
        let topic = mi.topic()
        let channels = mi.channels();
//      Do something with topic and channels
    }
});

发布

您可以通过这种方式向Magistral发送数据消息

let topic = "topic"
let channel = 0

try magistral.publish(topic, channel: channel, msg: Array("Hello from Swift SDK!".utf8), callback: { ack, error in
    print("✔︎ Published to " + ack.topic() + ":" + String(ack.channel()))
});

订阅

这是一个订阅和处理传入数据消息示例

let topic = "topic"
let group = "leader"

try magistral.subscribe(topic, group: group, listener: { message, error in
        print("✔︎ Message received : " + String(message.channel()) + " : " 
                                      + String(message.index()) + " : " + String(message.timestamp()))
    }, callback: { subMeta, error in
        if error == nil {
            print("✔︎ Subscribed!")
        }
    }
);

历史记录

Magistral允许您重放通过某些特定主题和通道发送的数据。这个功能称为历史记录。要查看通道中的最后n条消息

let topic = "topic"
let channel = 0
let count = 100

try magistral.history(topic, channel: channel, count: count, callback: { history, err in
    let messages = history.getMessages();    
    for msg in messages {
        print(String(msg.channel()) + " : " + String(msg.index()) + " : " + String(msg.timestamp()))
    }
});

您也可以提供时间戳以从这个时间点开始查找消息

let topic = "topic"
let channel = 0
let count = 100
let start = Date().timeIntervalSince1970.subtracting(6 * 60 * 60 * 1000);

try magistral.history(topic, channel: channel, start: UInt64(start), count: count, callback: { history, err in
    let messages = history.getMessages();    
    for msg in messages {
        print(String(msg.channel()) + " : " + String(msg.index()) + " : " + String(msg.timestamp()))
    }
});

时间间隔历史记录

您还可以在某些时间段内获取Magistral的历史数据。您需要指定开始和结束日期

let topic = "topic"
let channel = 0

let start = Date().timeIntervalSince1970.subtracting(6 * 60 * 60 * 1000);
let end = Date().timeIntervalSince1970.subtracting(4 * 60 * 60 * 1000);

try magistral.history(topic, channel: channel, start: UInt64(start), end: UInt64(end), callback: { history, err in
    let messages = history.getMessages();    
    for msg in messages {
        print(String(msg.channel()) + " : " + String(msg.index()) + " : " + String(msg.timestamp()))
    }
});

权限

这是访问控制功能的一部分。首先,要查看权限的全列表

try magistral.permissions({ meta, err in
    for mi in meta {
        for ch in mi.channels() {
            print(mi.topic() + ":" + String(ch) + " -> (r:w) .. " + String(mi.readable(ch)) + ":" + String(mi.writable(ch)));
        }
    }
});

或者如果您对获取某些特定主题的权限感兴趣

try magistral.permissions("topic", callback: { meta, err in
    for mi in meta {
        for ch in mi.channels() {
            print(mi.topic() + ":" + String(ch) + " -> (r:w) .. " + String(mi.readable(ch)) + ":" + String(mi.writable(ch)));
        }
    }
});

授权权限

您也可以为其他用户授权权限

let user = "user"
let topic = "topic"
let channel = 0
let r = true
let w = true
                        
try magistral.grant(user, topic: topic, read: r, channel: channel, write: w, callback: { meta, error in
    if error == nil {
//      Permissions has been successfully granted
    }
});

您必须具有超级用户权限才能执行此功能。

撤销权限

以类似的方式,您可以撤销用户权限

let user = "user"
let topic = "topic"
let channel = 0

try magistral.revoke(user, topic: topic, channel: channel, callback: { meta, err in
    if err == nil {
//      Permissions have been succefully revoked
    }
})

您必须具有超级用户权限才能执行此功能。

许可

Magistral是在MIT许可下发布的。有关详细信息,请参阅LICENSE。