Swamp 0.2.0

Swamp 0.2.0

测试已测试
语言语言 SwiftSwift
许可协议 MIT
发布上次发布2016年10月
SPM支持 SPM

Yossi Abraham 支持。



 
依赖项
SwiftyJSON~> 3.1.0
Starscream~> 2.0.0
CryptoSwift~> 0.6.0
 

Swamp 0.2.0

  • 作者
  • Yossi Abraham

Swamp - Swift WAMP 实现

Swamp 是 Swift 中的 WAMP 实现。

它目前支持调用远程过程,订阅主题,和发布事件。它也支持使用票据和 wampcra 进行身份验证。

Swamp 使用 WebSockets 作为其唯一可用的传输方式,JSON 作为其序列化方法。

欢迎合并支持 MessagePack 和原始套接字的消息贡献!

Swift 版本

Swift 版本 Swamp 版本 需求
2.x 0.1.x OSX 10.9 或 iOS 8.0
3 0.2.0 及以上 OSX 10.10 或 iOS 8.0

安装

Swamp 通过 cocoapods 提供。将以下代码添加到 Podfile 中。(对于 Swift 2 使用 '~> 0.1.0')。

pod 'Swamp', '~> 0.2.0'

到您的 Podfile 中。(对于 Swift 2 使用 '~> 0.1.0' )

使用方法

连接到路由器

import Swamp

let swampTransport = WebSocketSwampTransport(wsEndpoint:  NSURL(string: "ws://my-router.com:8080/ws")!)
let swampSession = SwampSession(realm: "router-defined-realm", transport: swampTransport)
// Set delegate for callbacks
// swampSession.delegate = <SwampSessionDelegate implementation>
swampSession.connect()
swampSession.disconnect()
SwampSession 构造函数参数
  • realm - 要加入的范围
  • transport - 一个 SwampTransport 实现
  • authmethods authid authrole authextra - 查看您的路由器文档并相应使用
连接/断开连接
  • connect() - 建立传输并执行配置的身份验证
  • disconnect() - 相反。

现在您应该等待您的代理回调

SwampSessionDelegate 接口

实现以下方法

  • func swampSessionHandleChallenge(authMethod: String, extra: [String: AnyObject]) -> String
    • 当一个挑战请求到达时会被触发。
    • 您可以通过该端代码来支持 wampcra 身份验证方法: return SwampCraAuthHelper.sign("your-secret", extra["challenge"] as! String)
  • func swampSessionConnected(session: SwampSession, sessionId: Int)
    • 在会话建立并认证成功、成功加入领域后触发。又称您现在可以调用、订阅和发布。
  • func swampSessionEnded(reason: String)
    • 在连接结束时触发。
    • reason通常是WAMP领域的错误,但也可以是关于WTF发生了什么的文字描述。

让我们开始吧!

  • 一般注意事项:许多回调函数接收args-kwargs对,请检查您的其他客户端实现以查看哪些被利用,并相应地操作。
调用远程过程

调用可能触发两个回调

  • onSuccess - 如果调用没有错误地完成。
  • onError - 如果调用失败。 (无论是路由器还是对等客户端。)
签名
public func call(proc: String, options: [String: AnyObject]=[:], args: [AnyObject]?=nil, kwargs: [String: AnyObject]?=nil, onSuccess: CallCallback, onError: ErrorCallCallback)
简单用例
session.call("wamp.procedure", args: [1, "argument1"],
    onSuccess: { details, results, kwResults in
        // Usually result is in results[0], but do a manual check in your infrastructure
    },
    onError: { details, error, args, kwargs in
        // Handle your error here (You can ignore args kwargs in most cases)
    })
完整用例
session.call("wamp.procedure", options: ["disclose_me": true], args: [1, "argument1"], kwargs: ["arg1": 1, "arg2": "argument2"], 
    onSuccess: { details, results, kwResults in
        // Usually result is in results[0], but do a manual check in your infrastructure
    },
    onError: { details, error, args, kwargs in
        // Handle your error here (You can ignore args kwargs in most cases)
    })
订阅主题

订阅可能触发三个回调

  • onSuccess - 如果订阅成功。
  • onError - 如果没有成功。
  • onEvent - 如果成功,当实际事件被发布时触发。
签名
public func subscribe(topic: String, options: [String: AnyObject]=[:], onSuccess: SubscribeCallback, onError: ErrorSubscribeCallback, onEvent: EventCallback)
简单用例
session.subscribe("wamp.topic", onSuccess: { subscription in 
    // subscription can be stored for subscription.cancel()
    }, onError: { details, error in

    }, onEvent: { details, results, kwResults in
        // Event data is usually in results, but manually check blabla yadayada
    })
完整用例
session.subscribe("wamp.topic", options: ["disclose_me": true], 
    onSuccess: { subscription in 
        // subscription can be stored for subscription.cancel()
    }, onError: { details, error in
        // handle error                        
    }, onEvent: { details, results, kwResults in
        // Event data is usually in results, but manually check blabla yadayada
    })
发布事件

发布既可以在没有回调的情况下调用(称为未确认),也可以使用以下两个回调

  • onSuccess - 如果发布成功。
  • onError - 如果没有成功。
签名
// without acknowledging
public func publish(topic: String, options: [String: AnyObject]=[:], args: [AnyObject]?=nil, kwargs: [String: AnyObject]?=nil)
// with acknowledging
public func publish(topic: String, options: [String: AnyObject]=[:], args: [AnyObject]?=nil, kwargs: [String: AnyObject]?=nil, onSuccess: PublishCallback, onError: ErrorPublishCallback) {
简单用例
session.publish("wamp.topic", args: [1, "argument2"])
完整用例
session.publish("wamp.topic", options: ["disclose_me": true],  args: [1, "argument2"], kwargs: ["arg1": 1, "arg2": "argument2"],
    onSuccess: {
        // Publication has been published!
    }, onError: { details, error in
        // Handle error (What can it be except wamp.error.not_authorized?)
    })

测试

目前,只存在针对crossbar的集成测试。我计划将来添加单元测试。

要运行测试

  1. 安装Docker for Mac(简单易行)
  2. 使用XCode打开Example/Swamp.xcworkspace
  3. 选择Swamp_Test-iOSSwamp_Test-OSX
  4. 运行测试!(Product -> Test或⌘U)

故障排除

如果由于某些原因测试失败,请确保

  • 已安装并可在/usr/local/bin/docker使用docker
  • 您的机器上有可用的端口8080

您还可以检查Example/swamp-crossbar-instance.log以了解在测试执行过程中crossbar实例发生了什么。

路线图

  1. MessagePack & 原生套接字
  2. 受话者角色
  3. 更健壮的代码库和错误处理
  4. 更通用和舒适的API
  5. 高级配置功能

贡献

  • Yossi Abraham,[邮箱保护](作者)
  • Dany Sousa,@danysousa(Swift 3支持)

许可证

我不在乎,是MIT,因为它是pod lib create的默认设置,而且我太懒惰去看tldrlegal